C语言的网络编程(未使用send()将数据从客户端发送到服务器)
我有两个文件,一个客户端和一个服务器,我想将变量(选项)的值从客户端发送到服务器,但是没有发送值,我不知道问题出在哪里 这是我的客户端代码C语言的网络编程(未使用send()将数据从客户端发送到服务器),c,sockets,send,recv,C,Sockets,Send,Recv,我有两个文件,一个客户端和一个服务器,我想将变量(选项)的值从客户端发送到服务器,但是没有发送值,我不知道问题出在哪里 这是我的客户端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h&
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<fcntl.h>
int main(int argc , char *argv[])
{
char buf;
int clientSocket, cnnt,fileDiscriptor,sizeInByte=0 , size=0 , serverSocket,choice=2 ;
struct sockaddr_in serverInfo;
if(argc != 3)
{
printf("Few arguments\nUsage : ./client <ip> <port>\n");
exit(1);
}
memset(&serverInfo,0,sizeof(serverInfo));
serverInfo.sin_family = AF_INET;
inet_aton(argv[1],&serverInfo.sin_addr.s_addr);
serverInfo.sin_port = htons(atoi(argv[2]));
clientSocket = socket(AF_INET,SOCK_STREAM,0);
if(clientSocket < 0)
{
printf("Could not create client socket\n");
exit(1);
}
cnnt = connect(clientSocket,(struct sockaddr *)&serverInfo,sizeof(serverInfo));
if(cnnt < 0)
{
printf("Could not create connection to the server\n");
exit(1);
}
recv(clientSocket , &serverSocket , sizeof(int) , 0);
send(serverSocket , &choice , sizeof(int),0);
close(clientSocket);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
焦炉;
int clientSocket,cnnt,filedescriptor,size=0,size=0,serverSocket,choice=2;
serverInfo中的结构sockaddr_;
如果(argc!=3)
{
printf(“少量参数\n用法:./client\n”);
出口(1);
}
memset(&serverInfo,0,sizeof(serverInfo));
serverInfo.sinu family=AF\u INET;
inet_aton(argv[1],&serverInfo.sin_addr.s_addr);
serverInfo.sinu port=htons(atoi(argv[2]);
clientSocket=socket(AF\u INET,SOCK\u STREAM,0);
if(clientSocket<0)
{
printf(“无法创建客户端套接字\n”);
出口(1);
}
cnnt=connect(clientSocket,(struct sockaddr*)&serverInfo,sizeof(serverInfo));
如果(cnnt<0)
{
printf(“无法创建到服务器的连接\n”);
出口(1);
}
recv(clientSocket和serverSocket,sizeof(int),0);
发送(serverSocket,&choice,sizeof(int),0);
关闭(clientSocket);
返回0;
}
这是我的服务器代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <sys/wait.h>
int main(int argc , char *argv[])
{
int choice;
int serverSocket, bnd, lstn , clientSize, connectionFd;
struct sockaddr_in serverInfo, clientInfo ;
if(argc != 2)
{
printf("Few arguments\nUsage : ./server <port>\n");
exit(1);
}
memset(&serverInfo , 0 , sizeof(serverInfo));
memset(&clientInfo , 0 , sizeof(clientInfo));
serverInfo.sin_family = AF_INET;
serverInfo.sin_port = htons(atoi(argv[1]));
serverInfo.sin_addr.s_addr = INADDR_ANY;
serverSocket = socket(AF_INET,SOCK_STREAM,0);
if(serverSocket < 0)
{
printf("Could not create server socket\n");
exit(1);
}
bnd = bind(serverSocket , (struct sockaddr *)&serverInfo , sizeof(serverInfo));
if(bnd < 0)
{
printf("Could not bind\n");
exit(1);
}
lstn = listen(serverSocket , 1);
if(lstn < 0)
{
printf("Could not listen on server socket\n");
exit(1);
}
clientSize = sizeof(clientInfo);
while(1)
{
connectionFd = accept(serverSocket , (struct sockaddr *)&clientInfo , &clientSize);
if(connectionFd < 0)
continue;
send(connectionFd , &serverSocket , sizeof(int) , 0);
recv(serverSocket , &choice , sizeof(int),0);
close(connectionFd);
break;
}
printf("CHOICE IS :%d\n",choice);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
智力选择;
int serverSocket、bnd、lstn、clientSize、connectionFd;
serverInfo、clientInfo中的结构sockaddr_;
如果(argc!=2)
{
printf(“少量参数\n用法:./server\n”);
出口(1);
}
memset(&serverInfo,0,sizeof(serverInfo));
memset(&clientInfo,0,sizeof(clientInfo));
serverInfo.sinu family=AF\u INET;
serverInfo.sinu port=htons(atoi(argv[1]);
serverInfo.sin\u addr.s\u addr=INADDR\u ANY;
serverSocket=socket(AF\u INET,SOCK\u STREAM,0);
如果(服务器套接字<0)
{
printf(“无法创建服务器套接字\n”);
出口(1);
}
bnd=bind(serverSocket,(struct sockaddr*)&serverInfo,sizeof(serverInfo));
如果(bnd<0)
{
printf(“无法绑定\n”);
出口(1);
}
lstn=侦听(serverSocket,1);
if(lstn<0)
{
printf(“无法在服务器套接字上侦听\n”);
出口(1);
}
clientSize=sizeof(clientInfo);
而(1)
{
connectionFd=accept(serverSocket,(struct sockaddr*)&clientInfo,&clientSize);
如果(连接fd<0)
继续;
发送(connectionFd和serverSocket,sizeof(int),0);
recv(serverSocket和choice,sizeof(int),0);
关闭(连接FD);
打破
}
printf(“选择是:%d\n”,选择);
返回0;
}
您确定它不是send
-ing吗?国际海事组织
recv(clientSocket和serverSocket,sizeof(int),0)代码>
在客户端中,正在阻塞,因此无法到达send()
调用。您能否将recv()
调用[这不是预期的和必需的,IMO]放在客户端的send()之后
提示:服务器正在侦听传入的连接,并且只要没有传入的连接,它就没有一个地址来发送
返回通信
- 服务器的常规流程:打开套接字-->绑定-->侦听-->接受
-->接收-->发送
- 客户端的常规流程:打开套接字-->连接-->发送-->
接受
编辑:
当您发送int
type,[超过1字节大小]时,我建议在客户端使用htonl()
,而ntohl()
是服务器端,以解决endianness问题[如果有]。服务器代码中的行:
send(connectionFd , &serverSocket , sizeof(int) , 0);
不需要,请将其删除。没有理由将服务器套接字的值发送到客户端,客户端无论如何都无法使用该值,文件描述符是连接到进程的资源,您不能通过将其值通过TCP连接写入客户端来将该资源传输到另一个进程
在客户端上,您需要在刚刚打开的连接上发送choice变量,因此
您需要更改以下两行:
recv(clientSocket , &serverSocket , sizeof(int) , 0);
send(serverSocket , &choice , sizeof(int),0);
为此:
send(clientSocket , &choice , sizeof(int),0);
除此之外,你应该养成一个习惯,检查你所有的呼叫是否有错误,这样你就知道如果有什么失败了,例如
int rc;
rc = send(clientSocket , &choice , sizeof(int),0);
if (rc == -1) {
perror("send()");
//handle error, e.g. exit the app
}
检查后发现客户端和服务器的发送和接收都有错误
如手册页中所示
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<fcntl.h>
int main(int argc , char *argv[])
{
char buf;
int clientSocket, cnnt,fileDiscriptor,sizeInByte=0 , size=0 , serverSocket,choice=2 ;
struct sockaddr_in serverInfo;
if(argc != 3)
{
printf("Few arguments\nUsage : ./client <ip> <port>\n");
exit(1);
}
memset(&serverInfo,0,sizeof(serverInfo));
serverInfo.sin_family = AF_INET;
inet_aton(argv[1],&serverInfo.sin_addr.s_addr);
serverInfo.sin_port = htons(atoi(argv[2]));
clientSocket = socket(AF_INET,SOCK_STREAM,0);
if(clientSocket < 0)
{
printf("Could not create client socket\n");
exit(1);
}
cnnt = connect(clientSocket,(struct sockaddr *)&serverInfo,sizeof(serverInfo));
if(cnnt < 0)
{
printf("Could not create connection to the server\n");
exit(1);
}
recv(clientSocket , &serverSocket , sizeof(int) , 0);
send(serverSocket , &choice , sizeof(int),0);
close(clientSocket);
return 0;
}
ssize_t send(int sockfd、const void*buf、size_t len、int标志)
ssize_t recv(内部sockfd、void*buf、大小长度、内部标志)
如我的代码中所示
发送(clientSocket,&choice,sizeof(int),0)
recv(serverSocket和choice,sizeof(int),0)
如果我正确应用了每个函数,是什么导致了错误?我已经完成了编辑,这是我在服务器上得到的选择值,选择值是:-963738432