亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

你好,本人在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 關注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號