首先我说下一下几个基本的步骤:
1、socket
2、bind绑定
3、listen
4、accpet
5、recv
6、发送
1.socket
int socket(int domain, int type, int protocol);
功能:
创建用来通信的套接字
参数:
domain:通信域
AF_INET
type:流式套接字
SOCK_STREAM
protocol:
默认为0
返回值:
成功返回文件描述符
失败返回-1
2.listen
int listen(int sockfd, int backlog);
功能:
监听客户端发送的三次握手链接请求
参数:
sockfd:套接字文件描述符
backlog:允许等待且尚未被处理的三次握手请求连接个数
返回值:
成功返回0
失败返回-1
3.connect
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:
向指定IP地址端口号发送三次握手链接请求
参数:
sockfd:套接字文件描述符
addr:要链接的IP地址
addrlen:地址长度
返回值:
成功返回0
失败返回-1
4.accept
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
处理等待队列中第一个三次握手链接请求
参数:
sockfd:套接字文件描述符
addr:接收发送三次握手端的IP地址信息
addrlen:接收发送三次握手端的IP地址长度信息
返回值:
成功返回新的用来通信的文件描述符
失败返回-1
5.send
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
发送信息
参数:
sockfd:通信的文件描述符
buf:发送数据空间首地址
len:发送数据长度
flags:默认为0
返回值:
成功返回实际发送字节数
失败返回-1
6.recv
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
接收信息
参数:
sockfd:套接字文件描述符
buf:存放数据空间首地址
len:最大接收数据长度
flags:默认为0
返回值:
成功返回实际接收字节数
失败返回-1
对方关闭套接字返回0
粘包问题:
发送数据量小,接收数据量大时,数据会粘连到一起,并实现发送
解决方法:
1.每次发送数据时,产生时间间隔
2.定长发送
下面我附上他的源代码
#include “head.h”
int main(int argc, const char *argv[])
{
int confd = 0;
int sockfd = 0;
int Ret = 0;
char TmpBuff[4096] = {0};
struct sockaddr_in SerAddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockfd)
{
perror("fail to socket");
return -1;
}
SerAddr.sin_family = AF_INET;
SerAddr.sin_port = htons(50000);
SerAddr.sin_addr.s_addr = inet_addr("192.168.0.183");
Ret = bind(sockfd, (struct sockaddr *)&SerAddr, sizeof(SerAddr));
if (-1 == Ret)
{
perror("fail to bind");
return -1;
}
Ret = listen(sockfd, 10);
if (-1 == Ret)
{
perror("fail to listen");
return -1;
}
confd = accept(sockfd, NULL, NULL);
if (-1 == confd)
{
perror("fail to accept");
return -1;
}
Ret = recv(confd, TmpBuff, sizeof(TmpBuff), 0);
if (-1 == Ret)
{
perror("fail to recv");
return -1;
}
printf("RECV:%s\n", TmpBuff);
sprintf(TmpBuff, "%s ------echo----", TmpBuff);
Ret = send(confd, TmpBuff, strlen(TmpBuff)+1, 0);
if (-1 == Ret)
{
perror("fail to send");
return -1;
}
close(confd);
close(sockfd);
return 0;
}