gpt4 book ai didi

c - C : Data not being sent/received properly? 中的服务器/套接字编程

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:16 25 4
gpt4 key购买 nike

我正在编写一个监听连接的服务器端程序。当它收到一个时,它会产生一个分离的线程并处理连接。我希望它能够接收从客户端发送的多行数据,并将其存储在数据结构中(这样我可以稍后对其进行排序)。

客户端这样做:

  1. 获取 .csv 文件的文件大小
  2. 将文件大小发送到服务器
  3. 打开.csv
  4. 使用 fgets() 检索一行并将其放入缓冲区
  5. 将这一行的字节数发送到服务器
  6. 将线路数据发送到服务器

目标是逐行发送数据,并将每一行存储在服务器端的结构中。问题是,数据没有被发送过来。似乎单个发送请求被切断并在两个不同的 recv() 调用中处理。

客户端发送循环:

void sendData(int sock, FILE* fd){
char data[BUFFER];
int32_t filesize;

printf("seeking\n");
if((fseek(fd, 0L, SEEK_END)) == ERROR){
fprintf(stderr, "An error has occured: %s\n", strerror(errno));
exit(EXIT_FAILURE);
};
if((filesize = ftell(fd)) == ERROR){
fprintf(stderr, "An error has occured: %s\n", strerror(errno));
exit(EXIT_FAILURE);
};
rewind(fd);

// subtracting bytes for the col headers
//filesize -= COLSIZE;
fgets(data, sizeof(data), fd);
printf("strlen of data: %d\n", (int)strlen(data));
printf("\nfilesize: %ld\n", (long)filesize);
filesize = filesize - strlen(data);
printf("\nfilesize: %ld\n", (long)filesize);
// converting data len to net order
filesize = htonl(filesize);
char* len_data = (char*)&filesize;
// sending filesize
printf("sending filesize\n");
send(sock, len_data, sizeof(int32_t), 0);
filesize = ntohl(filesize);
printf("\nfilesize: %ld\n", (long)filesize);

// grabbing first line and sending
//printf("fgetting test\n");
while(filesize > 0){
while(fgets(data, sizeof(data), fd) != NULL){
if(data[strlen(data) - 1] == '\n'){
printf("\ntaking newline out\n");
data[strlen(data) - 1] = '\0';
}

// getting and sending size of the line
int32_t dataSize = sizeof(char)*strlen(data);
printf("data size of line: %d\n", dataSize);
dataSize = htonl(dataSize);
char* lineSize = (char*)&dataSize;
int j = send(sock, lineSize, sizeof(int32_t), 0);
printf("size of data sent: %d\n", j);

// sending the line
printf("line of data: %s\n", data);
int i = send(sock, data, sizeof(char)*strlen(data), 0);
printf("size of data sent: %d\n", i);
filesize -= i;
printf("new filesize: %d\n", filesize);
}
}

客户端输出:

taking newline out
data size of line: 303
size of data sent: 4
line of data: Color,Andrew Stanton,462,132,475,530,Samantha Morton,640,73058679,Action|Adventure|Sci-Fi,Daryl Sabara,John Carter ,212204,1873,Polly Walker,1,alien|american civil war|male nipple|mars|princess,http://www.imdb.com/title/tt0401729/?ref_=fn_tt_tt_1,738,English,USA,PG-13,263700000,2012,632,6.6,2.35,24000
size of data sent: 303
new filesize: 1001

服务器接收循环:

    int32_t linesize;
int32_t filesize;
// set to 1 to attempt to receive bytes
receive_int(&filesize,sock_info->sock);
printf("Recieving file size %d\n", filesize);
// wait for a recv
while(filesize){

printf("\nCurrent File Size: %ld\n",(long) filesize);
receive_int(&linesize,sock_info->sock);
printf("Line size: %ld\n", (long)linesize);
char* filebuf = (char*)malloc(sizeof(char)*linesize);
printf("size of filebuf: %d\n", sizeof(*filebuf));
int i = recv(sock_info->sock, filebuf, sizeof(char)*linesize, 0);
printf("strlen of filebuf: %d\n", strlen(filebuf));
printf("number of bytes received: %d\n", i);
printf("Received msg: %s\n",filebuf);
filesize -= i;


}

服务器输出

Current File Size: 1304                                                                                              
Line size: 303
size of filebuf: 1
strlen of filebuf: 165
number of bytes received: 165
Received msg: Color,Andrew Stanton,462,132,475,530,Samantha Morton,640,73058679,Action|Adventure|Sci-Fi,Daryl Sabara,John Carter ,212204,1873,Polly Walker,1,alien|american civil

Current File Size: 1139
Line size: 2002875004
size of filebuf: 1
strlen of filebuf: 134
number of bytes received: 1139
Received msg: male nipple|mars|princess,http://www.imdb.com/title/tt0401729/?ref_=fn_tt_tt_1,738,English,USA,PG-13,263700000,2012,632,6.6,2.35,24000

最佳答案

recvman 页面所示:

The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.

man 页面中的 send 所示:

With a zero flags argument, send() is equivalent to write(2). ... On success, these calls return the number of bytes sent.

man 页面中的 write 所示:

writes up to count bytes from the buffer starting at...

如您所见,网络 sendrecv 不保证实际发送的数据长度或每个接收数据的长度函数调用

此外,当数据包在网络中移动时,单个数据包被分成多个数据包(例如,由于网络 MTU 设置的差异)是很常见的。

处理网络数据的唯一方法是将其视为连续流。

为了找到换行标记,接收端点必须连接所有接收到的数据并沿着换行标记将其切割。

我推荐Beej's guide作为启动网络编码的良好资源。

祝你好运。

关于c - C : Data not being sent/received properly? 中的服务器/套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47842427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com