C 套接字编程问题

C 套接字编程问题,c,sockets,C,Sockets,我在Unix操作系统上使用C语言中的套接字编程实现了客户机-服务器。我在客户端使用了非阻塞套接字。我想实现双向沟通。但其工作方式只有一种,即客户端可以在服务器上读写数据,而服务器不能在客户端上读写数据 客户 nread = recv(sock, ptr, nleft, MSG_DONTWAIT)) send(sock, ptr, nleft, 0)) 服务器 recv(sock, ptr, nleft, MSG_DONTWAIT)) SockWrite(sock, Message, dataL

我在Unix操作系统上使用C语言中的套接字编程实现了客户机-服务器。我在客户端使用了非阻塞套接字。我想实现双向沟通。但其工作方式只有一种,即客户端可以在服务器上读写数据,而服务器不能在客户端上读写数据

客户

nread = recv(sock, ptr, nleft, MSG_DONTWAIT))
send(sock, ptr, nleft, 0))
服务器

recv(sock, ptr, nleft, MSG_DONTWAIT))
SockWrite(sock, Message, dataLength)

服务器在读取时总是面临问题。有人能告诉我为什么以及如何摆脱这个问题吗?

等待套接字准备好使用call进行读写。

等待套接字准备好使用call进行读写。

recv的返回码是什么?您是否已将recv插座设置为非阻塞?在这种情况下,您可能会看到EAGAIN,您需要选择()等,或者返回到blocking。我不建议忽略系统调用的返回值。

recv的返回代码是什么?您是否已将recv插座设置为非阻塞?在这种情况下,您可能会看到EAGAIN,您需要选择()等,或者返回到blocking。我不建议忽略系统调用的返回值。

代码示例

static void SetNonBlock(const int nSock, bool bNonBlock)
{
    int nFlags = fcntl(nSock, F_GETFL, 0);
    if (bNonBlock) {
        nFlags |= O_NONBLOCK;
    } else {
        nFlags &= ~O_NONBLOCK;
    }

    fcntl(nSock, F_SETFL, nFlags);
}

     ...
     SetNonBlock(sock, true);
     ...
    int code = recv(sock, buf, len_expected, 0);
    if(code > 0) {
            here got all or partial data
    } else if(code < 0) {
        if((errno != EAGAIN) && (errno != EINPROGRESS) ) {
                         here handle errors
        }
              otherwise may try again       
    } else if(0 == code) {
        FIN received, close the socket
    }
static void SetNonBlock(常量int nSock,bool bNonBlock)
{
int nFlags=fcntl(nSock,F_GETFL,0);
if(bNonBlock){
nFlags |=O|U非块;
}否则{
nFlags&=~O_非块;
}
fcntl(nSock、F_SETFL、nFlags);
}
...
SetNonBlock(sock,true);
...
int code=recv(短袜,短袜,预期长度,0);
如果(代码>0){
这里有全部或部分数据
}否则如果(代码<0){
if((errno!=EAGAIN)&&(errno!=EINPROGRESS)){
这里处理错误
}
否则可以再试一次
}else if(0==代码){
如果收到,请关闭插座
}
代码示例

static void SetNonBlock(const int nSock, bool bNonBlock)
{
    int nFlags = fcntl(nSock, F_GETFL, 0);
    if (bNonBlock) {
        nFlags |= O_NONBLOCK;
    } else {
        nFlags &= ~O_NONBLOCK;
    }

    fcntl(nSock, F_SETFL, nFlags);
}

     ...
     SetNonBlock(sock, true);
     ...
    int code = recv(sock, buf, len_expected, 0);
    if(code > 0) {
            here got all or partial data
    } else if(code < 0) {
        if((errno != EAGAIN) && (errno != EINPROGRESS) ) {
                         here handle errors
        }
              otherwise may try again       
    } else if(0 == code) {
        FIN received, close the socket
    }
static void SetNonBlock(常量int nSock,bool bNonBlock)
{
int nFlags=fcntl(nSock,F_GETFL,0);
if(bNonBlock){
nFlags |=O|U非块;
}否则{
nFlags&=~O_非块;
}
fcntl(nSock、F_SETFL、nFlags);
}
...
SetNonBlock(sock,true);
...
int code=recv(短袜,短袜,预期长度,0);
如果(代码>0){
这里有全部或部分数据
}否则如果(代码<0){
if((errno!=EAGAIN)&&(errno!=EINPROGRESS)){
这里处理错误
}
否则可以再试一次
}else if(0==代码){
如果收到,请关闭插座
}

发布完整的源代码将增加您收到答案的机会。您能否澄清-您的意思是客户端可以“从服务器接收数据”和“向服务器发送数据”?如果是这种情况,那么您的服务器似乎能够从客户端发送/接收数据。是的,我希望客户端和服务器之间进行双向通信。发布完整的源代码将增加您收到答案的机会。您能澄清一下吗?您的意思是客户端可以“从服务器接收数据”和“向服务器发送数据”?如果是这种情况,那么您的服务器似乎能够从客户端发送/接收数据。是的,我希望客户端和服务器之间进行双向通信。