2 回答

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!");

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
- 2 回答
- 0 關注
- 96 瀏覽
添加回答
舉報