概述
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口
编程流程
服务器端: 1.socket() 建立套接字 2.bind() 绑定IP端口号 (struct sockaddr_in addr 初始化) 3.listen() 指定同时最大连接数 4.accept() 阻塞等待客服端发起连接 5.read() 读取数据 6.处理数据,大小写转换 7.write() 回写给客户端 8.循环读写 9.close
客户端: 1.socket() 建立套接字 2.bind() 绑定IP端口号 (struct sockaddr_in addr 初始化)(隐式绑定默认调用,客户端可以不写这个函数) 3.connect() 发起连接 4.write() 写数据 5.read() 读取数据 6.循环读写 7.close
struct sockaddr_in addr结构如下
服务器
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<string.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666
int main()
{
int lfd
,cfd
;
struct sockaddr_in serv_addr
;
struct sockaddr_in clien_addr
;
socklen_t clien_addr_len
,clien_ip_len
;
char buf_ip
[BUFSIZ
];
int n
,ret
;
lfd
=socket(AF_INET
,SOCK_STREAM
,0);
if(lfd
==-1)
{
perror("socket error ");
exit(1);
}
int opt
=1;
setsockopt(lfd
,SOL_SOCKET
,SO_REUSEADDR
,&opt
,sizeof(opt
));
bzero(&serv_addr
,sizeof(serv_addr
));
serv_addr
.sin_family
=AF_INET
;
serv_addr
.sin_port
=htons(SERV_PORT
);
serv_addr
.sin_addr
.s_addr
=htons(INADDR_ANY
);
ret
=bind(lfd
,(struct sockaddr
*)&serv_addr
,sizeof(serv_addr
));
if(ret
==-1)
{
perror("bind error");
exit(1);
}
ret
=listen(lfd
,128);
if(ret
==-1)
{
perror("listen error");
exit(1);
}
clien_addr_len
=sizeof(clien_addr
);
cfd
=accept(lfd
,(struct sockaddr
*)&clien_addr
,&clien_addr_len
);
if(cfd
==-1)
{
perror("accept error");
exit(1);
}
printf("client IP: %s,client port:%d\n ",
inet_ntop(AF_INET
,&clien_addr
.sin_addr
.s_addr
,buf_ip
,sizeof(buf_ip
)),
ntohs(clien_addr
.sin_port
));
while(1)
{
char buf
[BUFSIZ
];
memset(buf
,0,sizeof(buf
));
n
=read(cfd
,buf
,sizeof(buf
));
if(n
==0)
break;
printf("accept buf %s, length=%d\n",buf
,n
);
for(int i
=0;i
<n
;i
++)
buf
[i
]=toupper(buf
[i
]);
write(cfd
,buf
,n
);
}
close(lfd
);
close(cfd
);
return 0;
}
客户端
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<string.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666
int main()
{
int cfd
,sfd
;
struct sockaddr_in serv_addr
;
socklen_t serv_addr_len
;
char buf
[BUFSIZ
],clien_ip
[BUFSIZ
];
int n
;
char *find
;
memset(&serv_addr
,0,sizeof(serv_addr
));
serv_addr
.sin_family
=AF_INET
;
serv_addr
.sin_port
=htons(SERV_PORT
);
inet_pton(AF_INET
,SERV_IP
,&serv_addr
.sin_addr
.s_addr
);
cfd
=socket(AF_INET
,SOCK_STREAM
,0);
connect(cfd
,(struct sockaddr
*)&serv_addr
,sizeof(serv_addr
) );
while(1)
{
fgets(buf
,sizeof(buf
),stdin);
find
=strchr(buf
,'\n');
if(find
)
*find
='\0';
write(cfd
,buf
,strlen(buf
));
n
=read(cfd
,buf
,sizeof(buf
));
write(STDOUT_FILENO
,buf
,n
);
printf("\n");
}
close(cfd
);
return 0;
}
结果如下:成功实现通信和返回处理