目录
1.编程流程
2.代码演示
2.1 服务器代码
2.2 客户端代码
3.注意
3.1 ping命令
3.2 netstat命令
3.3 为什么memset?
3.4 哪个会阻塞?
3.5 显示连接信息
1.概念
1.1 编程流程
1.2 connect与listen
connect方法执行后,会进行三次握手,建立连接。
listen的第二个参数的含义?
已完成三次握手的等待队列的长度
2.代码演示
2.1 服务器代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);//监听套接字
assert(sockfd!=-1);
struct sockaddr_in saddr,caddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(6000);//主机,网络大小端转换
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");//IP地址转换
int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
assert(res!=-1);
res=listen(sockfd,5);
assert(res!=-1);
while(1)
{
int len=sizeof(saddr);
int c=accept(sockfd,(struct sockaddr*)&caddr,&len);//链接套接字
if(c<0)
{
continue;
}
printf("accept c=%d\n",c);
char buff[128]={0};
recv(c,buff,127,0);
printf("buff=%s\n",buff);
send(c,"ok",2,0);
close(c);
}
close(sockfd);
exit(0);
}
2.2 客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);//监听套接字
assert(sockfd!=-1);
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(6000);
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
assert(res!=-1);
printf("input:\n");
char buff[128]={0};
fgets(buff,127,stdin);
send(sockfd,buff,strlen(buff),0);
memset(buff,0,128);
recv(sockfd,buff,127,0);
printf("read:%s\n",buff);
close(sockfd);
exit(0);
}
运行结果:
3.注意
3.1 ping命令
如果出错了,可以使用ping命令
ping主要用来测试两个主机之间的连通性
3.2 netstat命令
用netstat可以查看IP地址和端口号的使用情况,netstat是一个功能很强大的网络信息统计工具,它可以打印本地网卡接口上的全部链接,路由表信息,网卡接口信息等.
网络编程我们主要用的就是,显示TCP连接及其状态信息
运行服务器代码再执行netstat命令:
运行服务器和客户端代码再执行netstat命令:
3.3 为什么memset?
sin_zero成员暂不使用,但总是将它置为0,为方便起见,在初始化结构时,我们一般是将整个结构置为0,而不仅仅是设置sin_zero成员为0;
3.4 哪个会阻塞?
listen不会阻塞;
accept会阻塞,如果已完成三次握手的队列为空,就是没有客户端和服务器连接,那么就无法处理接受连接客户端,就会阻塞在这里:
比如演示accept阻塞的情况,我们在accept之前加一句代码:
printf("accept wait...\n");
3.5 显示连接信息
要显示客户端的IP地址和端口:
printf("accept client ip:%s ,port=%d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
运行结果: