首先要了解TCP的通信原理
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buffer[128];
int nbyte;
int sin_size;
//创建socket
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create socket error\n");
exit(1);
}
//设置要绑定的地址
bzero(&server_addr, sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnum);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定地址
bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr_in));
//监听端口
listen(sockfd, 5);;
while(1)
{
//等待连接
sin_size = sizeof(struct sockaddr);
new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size);
printf("server get connect from %s\n", inet_ntoa(client_addr.sin_addr));
//接收数据
nbyte = recv(new_fd, buffer, 128, 0);
buffer[nbyte] = '\0';
printf("server received %s \n", buffer);
//结束连接
close(new_fd);
}
close(sockfd);
return 0;
int sockfd;
struct sockaddr_in server_addr;
char buffer[128];
//创建套接字
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create socket error\n");
exit(1);
}
//设置要连接的服务器的地址
bzero(&server_addr, sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnum);
server_addr.sin_addr.s_addr = inet_addr("192.168.146.129");
//连接服务器
if ( connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
{
printf("connect error\n");
exit(1);
}
//发送数据到服务器
printf("please input char:\n");
fgets(buffer, 128, stdin);
send(sockfd, buffer, strlen(buffer), 0);
//关闭连接
close(sockfd);
return 0;
在网络通信中,我们往往会用到不同的网络协议,有TCP,UDP,ICMP,IP,IGMP...
为了我们使用网络通信方便,Linux采用socket(套接字)来连接不同协议的接口,就相当于是在中间加入了一个交换机,自动把不同的网络连起来一样。这样我们就可以在不同的网络协议中用相同的函数了。
TCP编程模型
TCP通信需要服务器和客户端双方进行通信
首先服务器需要:创建socket,绑定地址,监听端口,等待连接,收发数据,结束连接
客户端需要:创建socket,连接服务器,收发数据,结束连接
创建socket
socket
绑定地址
bind
监听端口
listen
等待连接
accept
收发数据
send/revc
结束连接
close
连接服务器
connect
具体使用方法没必要去man一个函数,查找UNIX环境高级编程即可
在一个电脑同时开两个虚拟机
把Redhat作为服务器,把ubuntu作为客户端
服务器代码
#include
#include
#include
#include
#include
#define portnum 3333
int main()
{
}
客户端代码
#include
#include
#include
#include
#include
#define portnum 3333
int main()
{
}
在Redhat运行服务器
在ubuntu运行客户端
回车后在Redhat显示
这里面还有一些特殊的函数是用来把数据转化为网络字节序的,或者是把字符型IP和整数型IP之间进行转化