这几天写程序的中心点是socket,因为手上的一个项目在这一块出了些问题。问题在于我写的程序向伙伴写的程序发送数据,他的程序未能正确接收到我发送的数据。原以为套接字编程就是简简单单地几个socket库函数的使用而已,但现实的问题却总在提醒我,“哥们,你还太天真了!”。痛定思痛,有了以下几点新的认识。
1.流数据的读写,不是一次完成的(如果数据比较大),而是可能分成好几读到的。这个就像是网络中发送数据包一样,如果数据包太大,在发送之前会先对其分片,然后一片一片第发送出去。
2.套接字缓冲区大小可根据需要自行设定。套接字发送数据的过程中,数据是先从数据buffer复制到套接字的发送缓冲区,然后再把发送缓冲区的数据发送出去;而接收数据的过程,则是将收到的数据放到套接字的接收缓冲区中,然后读取到用户程序的缓冲区中。因而,如果数据量比较大的情况,需要自行将套接字缓冲区设的大一点。以下写了几个操作套接字缓冲区大小的函数。
/* 获取发送缓冲区大小 */
int getSndBufSize(int sock)
{
int snd_size = 0;
socklen_t optlen = 0;
int err = -1;
optlen = sizeof(snd_size);
err = getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_size, &optlen);
if (err < 0) {
printf("get socket buffer size error\n");
return -1;
}
return snd_size;
}
/* 获取接收缓冲区大小 */
int getRcvBufSize(int sock)
{
int rcv_size = 0;
socklen_t optlen = 0;
int err = -1;
optlen = sizeof(rcv_size);
err = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
if (err < 0) {
printf("get socket buffer size error\n");
return -1;
}
return rcv_size;
}
/* 设置发送缓冲区大小 */
void setSndBufSize(int sock, int set_size)
{
int snd_size = 0;
socklen_t optlen = 0;
int err = -1;
snd_size = set_size;
optlen = sizeof(snd_size);
err = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_size, optlen);
if (err < 0) {
printf("set snd buff size error\n");
return ;
}
printf("set snd buff size success\n");
printf("snd buff size = %d\n", getSndBufSize(sock));
return ;
}
/* 设置接收缓冲区大小 */
void setRcvBufSize(int sock, int set_size)
{
int rcv_size = 0;
socklen_t optlen = 0;
int err = -1;
rcv_size = set_size;
optlen = sizeof(rcv_size);
err = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_size, optlen);
if (err < 0) {
printf("set rcv buff size error\n");
return ;
}
printf("set rcv buff size success\n");
printf("rcv buff size = %d\n", getRcvBufSize(sock));
return ;
}