服务器代码:
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
int res,listenfd,clientfd; //返回值,监听套接字,客户套接字
char buff[BUFSIZ]="";
int len;
struct sockaddr_in serveraddr; //地址类型
bzero(&serveraddr,sizeof(serveraddr)); //清空
serveraddr.sin_family=AF_INET; //使用AF_INET域
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); //可以连接到本服务器的地址类型,即IP类型,这里是任意类型
serveraddr.sin_port=htons(50002);//指定端口号
len=sizeof(serveraddr);
listenfd=socket(AF_INET,SOCK_STREAM,0); //创建套接字
bind(listenfd,(struct sockaddr*)&serveraddr,len);//命名套接字
listen(listenfd,23); //设置可连接的数量
clientfd=accept(listenfd,NULL,NULL); //接受链接
printf("connecct a client\n");
while(strncmp(buff,"end",3))
{
res=read(clientfd,buff,BUFSIZ); //从客户端读取数据
write(2,buff,res); //把数据显示到显示器,最好用write来显示,如果用printf灯可能显示上次留下的数据
write(clientfd,"server",6); //往客户端写数据
}
close(clientfd);//关闭客户端
close(listenfd); //关闭监听
exit(0);
}
客户端代码:
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
int res,connfd,len; //返回值,连接套接字,地址长度
struct sockaddr_in connaddr; //客户端要链接的服务器的地址,应该与服务器的地址一致
char buff[BUFSIZ];
bzero(&connaddr,sizeof(connaddr)); //清空套接字
if(argc<2)
{
printf("the option is too less\n");
exit(0);
}
connaddr.sin_family=AF_INET; //使用AF_INET域
connaddr.sin_addr.s_addr=inet_addr(argv[1]);//确定要链接的地址
connaddr.sin_port=htons(50002);//要链接的端口号
connfd=socket(AF_INET,SOCK_STREAM,0);//创建套接字
len=sizeof(connaddr);//获取地址长度
connect(connfd,(struct sockaddr*)&connaddr,len);//创建链接
write(connfd,"Hello !",7);//往服务器写数据
while(res=read(connfd,buff,BUFSIZ))
{
printf("%d\n",res); //显示收到的字节数
res=read(fileno(stdin),buff,BUFSIZ); //从服务器读取数据
write(connfd,buff,res);
}
close(connfd);//关闭套接字
exit(0);
}
虽然每次服务器,客户端都会给对方发送一个ACK来确认收到,但read函数一般不会读取到,如果某一方发送FIN或RST信号,read都会当作读到文件尾来处理,即返回0;