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

代码如下:
#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 10
int 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)处),也是能正常工作的,就是在服务器先收后发的时候出问题,客户端收不到服务器发的数据,这是怎么回事?该如何解决?

呼啦一阵风
浏览 123回答 2
2回答

慕码人8056858

应该没有关系的,你确认下面这么做也是正常的?//TCPSend(buf1);----------(1)&nbsp;if((recvbytes=recv(client_fd,buf,100,0))==-1)&nbsp;{&nbsp;perror("recv 出错!");&nbsp;exit(1);&nbsp;}&nbsp;//else&nbsp;//{&nbsp;//TCPSend(buf1);//-----(2)&nbsp;//printf("buf1 has been sent!");&nbsp;//}TCPSend(buf1);//-----(3)&nbsp;printf("buf1 has been sent!");&nbsp;

胡子哥哥

int TCPSend(char data[])函数里面的send函数的第一个参数不是sockfd, 应该是client_fd.&nbsp;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 sendend sendnow recvend recvsend data test!这边还是建议每次accept后开一个线程出去send和recv
打开App,查看更多内容
随时随地看视频慕课网APP