前言:
这里给出一个简单的socket网络编程实例,使用tcp协议进行通信。
服务端:进行监听,连接成功后,收到客户端的信息,打印出信息内容,并给客户端发送回应。
客户端:连接成功后,给服务端发送信息,并接收服务端的回应,打印出回应内容。
程序:
服务端
文件名:server.c
#include
#include
#include
#include
#include
#include
int main()
{
char buffread[1024]={0};
char buffwrite[1024]="get success";
int server_fd,client_fd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
int i;
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
{
return -1;
}
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
server_address.sin_port=htons(1234);//服务端和客户端的端口号要一致
i=bind(server_fd,(struct sockaddr*)&server_address,sizeof(server_address));
if(i==-1)
{
return -1;
}
i=listen(server_fd,5);
if(i==-1)
{
return -1;
}
client_fd=accept(server_fd,(struct sockaddr*)&client_address,(socklen_t *__restrict)&client_len);
if(client_fd==-1)
{
return -1;
}
recv(client_fd,buffread,1024,0);
printf("the message:%s\n",buffread);
send(client_fd,buffwrite,sizeof(buffwrite),0);
close(server_fd);
close(client_fd);
return 0;
}
客户端:
文件名:client.c
#include
#include
#include
#include
#include
int main()
{
int rslt=0;
rslt = socket(AF_INET, SOCK_STREAM, 0);
if(rslt == -1){
return -1;
}
struct sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_addr.s_addr = inet_addr("10.20.88.189");
serAddr.sin_port = htons(1234); //服务端和客户端的端口要一致
int i = -1;
i = connect(rslt, (struct sockaddr*)&serAddr, sizeof(struct sockaddr_in)) ;
if( i == -1){
return -1;
}
char buffsend[1024]="hello";
i = send(rslt, buffsend, 1024, 0);
if(i<=0)
{
return -1;
}
char buffrecv[1024]={0};
i = recv(rslt, buffrecv, 1024, 0);
if(i <= 0){
return -1;
}
printf("the server response:%s\n",buffrecv);
close(rslt);
return 0;
}
对以上程序进行解析:
#include
int socket(int family, int type, int protocol); //指定期望的通信协议类型,返回的文件描述符和套接字描述符类似,我们成为套接字描述符,简称sockfd
family:协议族
AF_INET IPv4协议
AF_INET6 IPv6
AF_LOCAL Unix域协议(15章)
AF_ROUTE 路由套接字(18章)
AF_KEY 密钥套接字(19章)
type:套接字的类型
SOCK_STREAM(常用) 字节流套接字
SOCK_DGRAM 数据报套接字
SOCK_SEQPACKET 有序分组套接字
SOCK_RAW 原始套接字
protocol:协议类型的常量或设置为0,以选择给定的family和type组合的系统默认值
IPPROTO_TCP TCP传输协议
IPPROTO_UDP UDP传输协议
IPPROTO_SCTP SCTP传输协议
int send(SOCKET s, const char FAR *buf, int len, int flags);
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。
客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。
第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程序要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字节数;
第四个参数一般置0。
int recv(SOCKET s, char FAR *buf, int len, int flags);
不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。
第一个参数指定接收端套接字描述符;
第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
第三个参数指明buf的长度;
第四个参数一般置0。
完!!