TCP通信
流程圖如下
1、創建--socket套接字
相同
2、綁定--將創建的socket套接字返回的句柄與本機的ip、端口綁定
相同
3、監聽--監聽socket
#include<sys/socket.h>
int listen(int s,int backlog);
s--監聽的句柄
backlog--監聽的最大數,默認20
成功返回0 ,失敗返回 -1
4、建立連接--當客戶端請求後,調用accept()建立與客戶端的連接
#include<sys/socket.h>
int accept(int s,struct sockaddr *addr,socklen_t *addrlen);
accept()函數從連接請求隊列中獲得連接信息,創建新的套接字,並返回該套接字的文件描述符,客戶端與服務器端通過新的套接字通信。最初通過socket創建的套接字扔監聽客戶端請求。
s -- 監聽的套接字句柄
addr -- 服務器的地址結構體
addrlen -- 地址結構體大小
成功返回新套接字句柄,失敗返回-1
5、發送(接收)
#include<sys/socket.h>
#include<sys/types.h>
ssize_t send(int s, const *buf, size_t len,int flags);
s --- accept()返回的新句柄
buf -- 發送數據的緩衝區首地址
len -- buf的大小
成功返回發送的字節數, 失敗返回0
ssize_t recv(int s,void *buf,size_t len,int flags);
s--accept()返回的新句柄
buf -- 發送數據的緩衝區首地址
len--緩衝區的最大
6、關閉socket
7、connect()
#include<sys/types.h>
#include<sys/sockt.h>
int connect(int sockfd, struct sockaddr * serv_sddr, int addr_len);
成功返回 0 失敗返回-1
代碼實例:
//服務器端,echo_server.c
/**
流程:
1、創建--socket套接字
2、綁定--將創建的socket套接字返回的句柄與本機的ip、端口綁定
3、監聽--監聽socket
4、建立連接--當客戶端請求後,調用accept()建立與客戶端的連接
5、發送(接收)
6、關閉socket
**/
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<unistd.h>
#define ECHO_PORT 9091
#define MAX_CLIENT_NUM 10
int main()
{
int sock_fd;
int count = 1;
struct sockaddr_in serv_addr;
struct sockaddr_in client_addr;
int clientfd;
int res;
char buf[101];
char buf2[]="this is server";
socklen_t len;
int n;
//1 socket()
sock_fd = socket(AF_INET,SOCK_STREAM,0);
if(sock_fd == -1)
{
perror("create socket error\n");
return 0;
}
printf("create socket ok\n");
//2 bind()
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(ECHO_PORT);
serv_addr.sin_addr.s_addr = INADDR_ANY;
res = bind(sock_fd,(struct sockaddr*) &serv_addr,sizeof(serv_addr));
if (res != 0)
{
perror("bind socket error\n");
close(sock_fd);
return 0;
}
else{
printf("bind ok\n");
}
//3 listen()
res = listen(sock_fd,MAX_CLIENT_NUM);
if(res != 0)
{
perror("listen socket error\n");
close(sock_fd);
return 0;
}
else{
printf("listen ok\n");
}
len = sizeof(client_addr);
while(1)
{
//4 accept()
clientfd = accept(sock_fd,(struct sockaddr*) &client_addr,&len);
if(clientfd <= 0)
{
perror("accept socket error\n");
//close(sock_fd);
//return 0;
continue;
}
else{
printf("accept ok\n");
}
//5 接收
res = recv(clientfd,buf,100,0);
if(res <= 0)
{
close(clientfd);
continue;
}
buf[res]='\0';
printf("===%d===\nclinet request:%s*\n",count,buf);
if((strncmp(buf,"quit",4))==0)
{
send(clientfd,"exit",4,0);
break;
}
send(clientfd,buf2,sizeof(buf2),0);
count ++;
}
close(clientfd);
close(sock_fd);
return 0;
}
//客戶端
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<unistd.h>
#define ECHO_PORT 9091
#define MAX_CLIENT_NUM 10
int main()
{
int sock_fd;
int res;
struct sockaddr_in serv_addr;
char buf[] ="this is from client";
//1 socket()
sock_fd = socket(AF_INET,SOCK_STREAM,0);
//2 connect()
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(ECHO_PORT);
serv_addr.sin_addr.s_addr = INADDR_ANY;
connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) ;
//3 send()
send(sock_fd,buf,sizeof(buf),0);
//4recv
res = recv(sock_fd,buf,100,0);
buf[res]='\0';
printf("server response :%s\n",buf);
close(sock_fd);
return 0;
}