步骤:
1、定义sockaddr_in结构体 并对里面的成员进行初始化
sin_family IPV4还是IPV6
sin_port 端口号
hton: host to net //主机 -> 网络 小端转大端
struct sockaddr_in server_addr , client_addr;
//对服务端网络信息结构体进行初始化
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(6060);
//server_addr.sin_addr.s_addr = inet_addr("192.0.0.1");
server_addr.sin_addr.s_addr = inet_addr("本地主机IPV4地址");
—
2、创建套接字
//创建套接字,该套接字起到监听与传输信息的作用
int server_sockfd = socket(AF_INET , SOCK_STREAM , 0);
3、将 socket 绑定在指定的 IP 地址和端口
//4.将IP地址与端口号绑定到监听套接字上
bind(server_sockfd , (struct sockaddr*)&server_addr , sizeof(server_addr));
4、监听
等待连接
128代表监听序列的大小
listen(server_sockfd , 128);
5、接受连接
接收客户端的连接,第二个参数客户端的网络结构体,accept成功后可以通过第二个参数,获取客户端的ip
accept(server_sockfd , (struct sockaddr*)&client_addr , &addrlen))
Socket通信主要是为了解决计算机网络中的进程间通信问题。在网络编程中,有两个进程需要进行通信才能完成特定的任务,这两个进程可能运行在不同的计算机上,也可能运行在同一台计算机上的不同进程中。Socket提供了一种标准化的接口,使得这些进程能够在网络中进行数据交换和通信。
Socket也提供了一条可靠的通信通道,使得两个计算机之间可以进行数据交换和通信。就像我们在打电话或发送信息时需要先建立连接、传输数据,然后再断开连接一样,Socket也需要先建立连接、传输数据,最后再关闭连接。而且就像电话线路或电线路可以支持不同的通信协议和数据类型一样,Socket也可以支持不同的网络协议和数据格式。
#include <arpe/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr); //将点分十进制的ip地址转化为用于网络传输的数值格式
返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len); //将数值格式转化为点分十进制的ip地址格式
返回值:若成功则为指向结构的指针,若出错则为NULL
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define _SERVER_IP "192.168.3.239"
int server_shutdown;
int main(void)
{
struct sockaddr_in server_addr,client_addr;
int server_sock,client_sock;
char recv_buf[1500];
char cip[16];
int recv_len;
int flag;
socklen_t addrlen;
server_shutdown = 1;
/*定义网络信息结构体*/
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET,_SERVER_IP,&server_addr.sin_addr.s_addr);
/*创建 sockfd*/
if((server_sock = socket(AF_INET,SOCK_STREAM,0))==-1){
perror("sock call failed");
exit(0);
}
/*绑定网络信息*/
if((bind(server_sock,(struct sockaddr*)&server_addr,sizeof(server_addr)))==-1){
perror("bind call failed");
exit(0);
}
/*网络连接监听*/
listen(server_sock,128);
while(server_shutdown){
/*持续等待建立连接*/
addrlen = sizeof(client_addr);
if((client_sock = accept(server_sock,(struct sockaddr*)&client_addr,&addrlen))>0){
/*客户端连接成功,向客户端返回欢迎信息*/
bzero(recv_buf,sizeof(recv_buf));
inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,cip,16);
sprintf(recv_buf,"Hi,%s\n",cip);
send(client_sock,recv_buf,strlen(recv_buf),0);
printf("connet success,ip %s , port %d\n",cip,ntohs(client_addr.sin_port));
}else if(client_sock == -1){
perror("accept call failed");
exit(0);
}
}
bzero(recv_buf,sizeof(recv_buf));
while((recv_len = recv(client_sock,recv_buf,sizeof(recv_buf),0))>0){
flag = 0;
while(recv_len > flag){
recv_buf[flag]=toupper(recv_buf[flag]);
flag++;
}
send(client_sock,recv_buf,strlen(recv_buf),0);
bzero(recv_buf,sizeof(recv_buf));
}
}
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define _SERVER_IP "192.168.3.239"
int main(void)
{
struct sockaddr_in server_addr;
int client_sock;
char recv_buf[1500];
int recv_len;
/*定义网络信息结构体*/
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET,_SERVER_IP,&server_addr.sin_addr.s_addr);
/*创建 sockfd*/
if((client_sock = socket(AF_INET,SOCK_STREAM,0))==-1){
perror("sock call failed");
exit(0);
}
/*发送一次连接请求*/
if((connect(client_sock,(struct sockaddr*)&server_addr,sizeof(server_addr)))==-1){
perror("bind call failed");
exit(0);
}
recv(client_sock,recv_buf,sizeof(recv_buf),0);
printf("%s",recv_buf);
bzero(recv_buf,sizeof(recv_buf));
while((fgets(recv_buf,sizeof(recv_buf),stdin))!=NULL){
send(client_sock,recv_buf,strlen(recv_buf),0);
recv(client_sock,recv_buf,sizeof(recv_buf),0);
printf("%s\n",recv_buf);
bzero(recv_buf,sizeof(recv_buf));
}
close(client_sock);
return 0;
}
socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)_socket send 阻塞-CSDN博客
网络编程:socket的阻塞模式和非阻塞模式_socket阻塞和非阻塞-CSDN博客
epoll水平触发(Level Triggered)和边缘触发(Edge Triggered)详解_epoll水平和边缘触发-CSDN博客