当前位置: 技术问答>linux和unix
高手请教socket 发送信息被合并
来源: 互联网 发布时间:2016-09-02
本文导语: 我使用客户端向服务器发送信息时,多条发送信息被服务器端合并成一条信息接收,这个如何解决? 客户端代码: #include #include #include #include int main(int argc, char **argv) { int fd; struct sockaddr_in address; int add...
我使用客户端向服务器发送信息时,多条发送信息被服务器端合并成一条信息接收,这个如何解决?
客户端代码:
#include
#include
#include
#include
int main(int argc, char **argv)
{
int fd;
struct sockaddr_in address;
int address_len;
int rtval;
char data[100];
char data2[100];
char ip[30];
int port = 8001;
int len;
struct timeval tvafter,tvpre;
struct timezone tz;
////////////////
memset(ip,0,sizeof(ip));
strcpy(ip,"192.168.1.4");
//printf(・s・asctime(gmtime(&timep)));
//建立套接口
fd = socket(AF_INET, SOCK_STREAM, 0);
//联接
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ip);
address.sin_port = htons(port);
address_len = sizeof(address);
rtval = connect(fd, (struct sockaddr *)&address, address_len);
if(rtval == -1)
{
printf("sent ddddddddd:%sn", data);
exit(1);
}
//发送数据
memset(data,0,sizeof(data));
gettimeofday (&tvpre , &tz);
snprintf(data,sizeof(data),"Client to Server--%d:%d---------n",tvpre.tv_sec,tvpre.tv_usec);
while(1)
{
send(fd, (void *)data, strlen(data), 0);
printf("sent line:Data-%sn",data);
}
//接收数据
printf("client exit.n");
//关闭
close(fd);
}
服务器代码:
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
int fd;
int address_len;
struct sockaddr_in address;
struct timeval tvafter,tvpre;
struct timezone tz;
//建立套接口
fd = socket(AF_INET, SOCK_STREAM, 0);
//绑定地址和端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_ANY);
address.sin_port = htons(8001);
address_len = sizeof(address);
bind(fd, (struct sockaddr *)&address, address_len);
//建立套接口队列
listen(fd, 50);
while(1) {
struct sockaddr_in client_address;
int len;
int client_sockfd;
char data[100];
char data2[100];
printf("waiting...");
fflush(stdout);
//等待
len = sizeof(client_address);
client_sockfd = accept(fd, (struct sockaddr *)&client_address, &len);
//接收数据
while(1)
{
recv(client_sockfd, (void *)data, 400,0);
printf("server receivce line:%sn", data);
usleep(1000);
}
//关闭联接
close(client_sockfd);
usleep(10);
}
}
客户端代码:
#include
#include
#include
#include
int main(int argc, char **argv)
{
int fd;
struct sockaddr_in address;
int address_len;
int rtval;
char data[100];
char data2[100];
char ip[30];
int port = 8001;
int len;
struct timeval tvafter,tvpre;
struct timezone tz;
////////////////
memset(ip,0,sizeof(ip));
strcpy(ip,"192.168.1.4");
//printf(・s・asctime(gmtime(&timep)));
//建立套接口
fd = socket(AF_INET, SOCK_STREAM, 0);
//联接
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ip);
address.sin_port = htons(port);
address_len = sizeof(address);
rtval = connect(fd, (struct sockaddr *)&address, address_len);
if(rtval == -1)
{
printf("sent ddddddddd:%sn", data);
exit(1);
}
//发送数据
memset(data,0,sizeof(data));
gettimeofday (&tvpre , &tz);
snprintf(data,sizeof(data),"Client to Server--%d:%d---------n",tvpre.tv_sec,tvpre.tv_usec);
while(1)
{
send(fd, (void *)data, strlen(data), 0);
printf("sent line:Data-%sn",data);
}
//接收数据
printf("client exit.n");
//关闭
close(fd);
}
服务器代码:
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
int fd;
int address_len;
struct sockaddr_in address;
struct timeval tvafter,tvpre;
struct timezone tz;
//建立套接口
fd = socket(AF_INET, SOCK_STREAM, 0);
//绑定地址和端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_ANY);
address.sin_port = htons(8001);
address_len = sizeof(address);
bind(fd, (struct sockaddr *)&address, address_len);
//建立套接口队列
listen(fd, 50);
while(1) {
struct sockaddr_in client_address;
int len;
int client_sockfd;
char data[100];
char data2[100];
printf("waiting...");
fflush(stdout);
//等待
len = sizeof(client_address);
client_sockfd = accept(fd, (struct sockaddr *)&client_address, &len);
//接收数据
while(1)
{
recv(client_sockfd, (void *)data, 400,0);
printf("server receivce line:%sn", data);
usleep(1000);
}
//关闭联接
close(client_sockfd);
usleep(10);
}
}
|
LINUX下操作套接字,就像操作普通文件一样。发送端不管发送多少次,数据都是到达了一个地址上,也就是说写到了同一个套接字。打个比方,你在编辑一个文件时,你是数据发送端,文件是数据接收端。你不停地写数据,但最后都是存到了同一个文件中。这样,当读取数据的时候,当前已经写了多少数据,就会读多少。
如果LZ想要分别读取每次发送的数据,可以使用这个办法:
发送数据的时候,连同数据的字节数一起发送过去;在读取的时候,先读取数据总字节数(要用二进制表示)bytes,然后紧接着读取bytes个字节的数据。
如果LZ想要分别读取每次发送的数据,可以使用这个办法:
发送数据的时候,连同数据的字节数一起发送过去;在读取的时候,先读取数据总字节数(要用二进制表示)bytes,然后紧接着读取bytes个字节的数据。
|
如果是有规则的数据,可以采用结构体的方式接收数据。
如果是无规则但连续的数据,可以通过构造分隔符或者指定数据格式的方式来读取。
如果是无规则但连续的数据,可以通过构造分隔符或者指定数据格式的方式来读取。
|
TCP是流的观念,数据是一连续的数据,你需要按格式来解吸,你可以自己定义分隔符或许一个数据长度,这样来把它分成一段一段数据在使用.
|
严重支持楼上的说法,理解"字节流"很重要
发送和接收数据要定好协议,即发送端以何种方式组包,同样接收端以何种方式拆包
发送和接收数据要定好协议,即发送端以何种方式组包,同样接收端以何种方式拆包
|
3楼和4楼说得很有道理。
至于细节的东西,综合LS两位的说法:
如果数据比较少的话,可以采用解析的方法;但如果数据量很大的话,可以采用我说的那种方法。
我现在也是在一点点地实践,欢迎大家指正哈!
至于细节的东西,综合LS两位的说法:
如果数据比较少的话,可以采用解析的方法;但如果数据量很大的话,可以采用我说的那种方法。
我现在也是在一点点地实践,欢迎大家指正哈!