为了账号安全,请及时绑定邮箱和手机立即绑定

你好,本人在Linux下编写一个简单的服务器程序遇到以下问题,望高手赐教!

你好,本人在Linux下编写一个简单的服务器程序遇到以下问题,望高手赐教!

呼啦一阵风 2023-03-20 16:12:38
代码如下:#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<sys/wait.h>#define SERVPORT 8080#define BACKLOG 10int sockfd,client_fd,sin_size;int TCPSend(char data[]){int length;length=send(sockfd,data,strlen(data),0);if(length<=0){printf("send data error!\n");close(sockfd);return(-1);}return (1);}main(){char data[100]="This is data!\n";char buf[100];char buf1[]="send data test!";int recvbytes;struct sockaddr_in my_addr;struct sockaddr_in remote_addr;bzero(buf,100);if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){printf("socket create error!");exit(1);}my_addr.sin_family=AF_INET;my_addr.sin_port=htons(SERVPORT);my_addr.sin_addr.s_addr=INADDR_ANY;bzero(&(my_addr.sin_zero),8);if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1){printf("bind error!");exit(1);}if(listen(sockfd,BACKLOG)==-1){printf("listen error!");exit(1);}while(1){sin_size=sizeof(struct sockaddr_in);if((client_fd=accept(sockfd,(struct sockaddr*)&remote_addr,&sin_size))==-1){printf("accept error!");continue;}printf(" Receved a connection from %s!\n",inet_ntoa(remote_addr.sin_addr));//TCPSend(buf1);----------(1)if((recvbytes=recv(client_fd,buf,100,0))==-1){perror("recv 出错!");exit(1);}else{TCPSend(buf1);//-----(2)printf("buf1 has been sent!");}bzero(buf,100);close(client_fd);}} 我希望该程序完成的工作是服务器接收客户端发来的数据,然后再给客户端发送一个数据,我遇到的问题是,服务器能接收到客户端的数据,但无法把数据发给客户端,我试了下,如果服务器不接收数据,只发送,客户端可以接收到服务器的数据,还有服务器先发送后接收(即把TCPSend(buf1)发在(1)处),也是能正常工作的,就是在服务器先收后发的时候出问题,客户端收不到服务器发的数据,这是怎么回事?该如何解决?
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

应该没有关系的,
你确认下面这么做也是正常的?

//TCPSend(buf1);----------(1) 
if((recvbytes=recv(client_fd,buf,100,0))==-1) 

perror("recv 出错!"); 
exit(1); 

//else 
//{ 
//TCPSend(buf1);//-----(2) 
//printf("buf1 has been sent!"); 
//}
TCPSend(buf1);//-----(3) 
printf("buf1 has been sent!");

 


查看完整回答
反对 回复 2023-03-22
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

int TCPSend(char data[])函数里面的send函数的第一个参数不是sockfd, 应该是client_fd. 
sockfd一直在监听着, 所以这边用到的时候就内存错误直接退出了.
////////////////////////////////////////////////////////////////
你看下你的客户端是否有问题. (比如bind的端口号, 连接的端口号等) 我是在Ubuntu上运行的, 结果正常. 下面是我的客户端测试代码:
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>

int main(void)
{
struct sockaddr_in cliaddr;
memset(&cliaddr, 0, sizeof(struct sockaddr_in));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(2000);
cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
memset(&cliaddr.sin_zero, 0, 8);

int sock = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sock)
{
printf("socket error\n");
return -1;
}
int brs = bind(sock, (struct sockaddr*)&cliaddr, sizeof(struct sockaddr_in));
if(-1 == brs)
{
printf("bind error\n");
return -1;
}

struct sockaddr_in addr;
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_aton("127.0.0.1", &addr.sin_addr);
memset(&cliaddr.sin_zero, 0, 8);

int rs = connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));

if(-1 == rs)
{
printf("connect error\n");
if(errno == EAFNOSUPPORT)
{
printf("7");
}
return -1;
}

char recv_buf[100];
char buf[100];
printf("now send\n");
int rs2 = send(sock, buf, sizeof(buf), 0);
if(-1 == rs2)
{
printf("send error\n");
return -1;
}
printf("end send\n");
printf("now recv\n");

size_t num = recv(sock, recv_buf, 100, 0);

printf("end recv\n");
if(-1 == num)
{
printf("recv error\n");
if(errno = ENOMEM)
{
printf("7");
}

return -1;
}
if(0 == num)
{
printf("another recv error\n");
return -1;
}

recv_buf[num] = '\0';
printf("%s\n\n\n", recv_buf);
}

客户端运行结果是:
now send
end send
now recv
end recv
send data test!

这边还是建议每次accept后开一个线程出去send和recv


查看完整回答
反对 回复 2023-03-22
  • 2 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信