Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在C语言中,服务器和客户端程序之间同时发送()和recv()?_Sockets_Tcp_Send_Tcpclient_Recv - Fatal编程技术网

Sockets 在C语言中,服务器和客户端程序之间同时发送()和recv()?

Sockets 在C语言中,服务器和客户端程序之间同时发送()和recv()?,sockets,tcp,send,tcpclient,recv,Sockets,Tcp,Send,Tcpclient,Recv,我正在做一个程序,我有一个客户端和服务器。客户端通过发送包含“ping”的消息来“ping”服务器。当服务器收到“ping”时,它应该发回一个“got_it” 我已经能够发送“ping”,服务器已经接收到它,并发送回“got_it”,但我的客户无法接收它 我需要做两个插座吗? 这是我客户的密码 int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; socklen_t len = sizeo

我正在做一个程序,我有一个客户端和服务器。客户端通过发送包含“ping”的消息来“ping”服务器。当服务器收到“ping”时,它应该发回一个“got_it”

我已经能够发送“ping”,服务器已经接收到它,并发送回“got_it”,但我的客户无法接收它

我需要做两个插座吗? 这是我客户的密码

int main(int argc, char **argv)
{
  int sockfd;
  struct sockaddr_in servaddr;
  socklen_t len = sizeof(servaddr);
  char mesg[1024];
  char mesg2[1024];
  char cli_ip[32];

  if(argc!=2){ 
    printf("Usage: %s <ip_addr>\n",argv[0]);
    return -EINVAL; 
  }

  sockfd = socket(PF_INET,SOCK_STREAM,0);
  if(sockfd<0) {
    perror("socket: ");
    return -EIO;
  }

  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(54321);
  inet_pton(AF_INET,argv[1],&servaddr.sin_addr);

  if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
    perror("connect: ");
    close(sockfd);
    return -EIO;


  }

  while(1){
        memset(mesg2,0,sizeof(mesg2));
    if(recv(sockfd,mesg2,sizeof(mesg2),0) > 0 ){
        puts(mesg2);
    }
    fgets(mesg,sizeof(mesg),stdin);
    send(sockfd,mesg,strlen(mesg),0);



  }
  close(sockfd);
  return 0;
}
int main(int argc,char**argv)
{
int-sockfd;
servaddr中的结构sockaddr_;
socklen_t len=sizeof(servaddr);
char-mesg[1024];
char-mesg2[1024];
char cli_ip[32];
如果(argc!=2){
printf(“用法:%s\n”,argv[0]);
返回-艾因瓦尔;
}
sockfd=套接字(PF_INET,SOCK_STREAM,0);

如果(sockfd)你确定服务器响应正确吗?你是否测试过,当你使用其他工具(如telnet)时,它会发送“got_it”消息?@j_random_hacker我很确定服务器工作正常。客户端是有问题的。当我运行客户端时,它会卡在recv()部分,但当我删除recv()时函数它运行平稳。您的客户端在调用
send()
之前调用了
recv()
!它什么时候发送过“ping”消息?@j_random_hacker好的。因此,我编辑了代码,在recv()之前调用了send()。它现在收到了“got_it”。耶!但是如果我发送的不是“ping”,它就会卡在recv()上再次分手。似乎如果它没有收到任何东西,它就会被卡在那里。我不知道你期望发生什么——等待消息就是recv()的工作!