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