我正在学习使用C ++进行非常基本的套接字编程 我被困在我试图发送随机生成的int的部分 在插座上。
server.cpp
int code = rand();
send(connfd, (char*)code, sizeof(int), 0);
client.cpp
int code = 0;
recv(connfd, (char*)code, sizeof(int), 0);
我做错了什么?
答案 0 :(得分:3)
首先:
您没有检查任何一个来电的返回值。插座是臭名昭着的(天生)容易出错。
假设所有字节都将一起发送和接收 - 但TCP很容易出现分段,碎片,部分发送和各种各样的东西,你永远不应该假设你接收到一次通话中发送的所有内容。这使得检查返回值变得更加重要!
你做的那个:(char*)code
是不正确的。更适合做(char*)&code
,但它不会识别部分接收。
假设您正在使用TCP套接字:
发送:
int data = rand();
char* tosend = (char*)&data;
int remaining = sizeof(data);
int result = 0;
int sent = 0;
while (remaining > 0) {
result = send(connfd, tosend+sent, remaining, 0);
if (result > 0) {
remaining -= result;
sent += remaining;
}
else if (result < 0) {
printf("ERROR!\n");
// probably a good idea to close socket
break;
}
}
接收:
int value = 0;
char* recv_buffer = (char*)&value;
int remaining = sizeof(int);
int received = 0
int result = 0;
while (remaining > 0) {
result = recv(connfd, recv_buffer+received, remaining, 0);
if (result > 0) {
remaining -= result;
received += result;
}
else if (result == 0) {
printf("Remote side closed his end of the connection before all data was received\n");
// probably a good idea to close socket
break;
}
else if (result < 0) {
printf("ERROR!\n");
// probably a good idea to close socket
break;
}
}
对于UDP套接字,一些主体在错误检查方面保持不变,向内存缓冲区转换或从内存缓冲区转换。但是使用UDP,你不应该进行&#34;循环&#34;因为UDP是一种数据报协议。