#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h> //bzero
#include <unistd.h>
#define PORT 3333
#define MAX_SIZE 1024
int main(){
int sockfd; //socket创建文件描述符
int opt; //设置套接字
int new_fd; //接受套接字的描述符
struct sockaddr_in server_addr; //主机
struct sockaddr_in client_addr; //客户端
int n_read; //读到的字节数
char buffer[MAX_SIZE]; //
//创建通信端点,返回一个文件描述符
//第一个参数:表示协议簇:用AF_INET 使用IPv4协议
//第二个参数:指定Socket类型 —— 流式套接字SOCK_STREAM
//第三个参数:当第三个参数为0时,会自动选择第二个参数类型对应的默认协议。
//正确返回套接字,失败返回-1
//注意:type和protocol不可以随意组合,如SOCK_STREAM不可以跟IPPROTO_UDP组合。
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
perror("socket error!");
exit(1);
}
printf("socket success!\n");
//设置套接字
//int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
//sockfd:创建的套接字
//level:被设置的选项的级别,如果想要在套接字级别上设置选项,就必须把level设置为 SOL_SOCKET
//接上; Socket描述符选项
//optname:SO_REUSEADDR BOOL 允许套接口和一个已在使用中的地址捆绑
//optval:指针,指向存放选项待设置的新值的缓冲区。
//optlen:optval缓冲区长度。
//这里使用int opt = 1;即socket可重用
//正确返回0。失败返回-1;
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) < 0){
perror("set socket option error!\n");
exit(1);
}
//bind绑定一个固定的网络地址和端口号(主机的地址和端口)
//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//sockfd:创建的套接字
//addr:是一个通用指针类型,addr参数实际上可以接受多种协议的
//sockaddr结构体,它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度
//绑定前设置结构体
bzero(&server_addr,0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr("192.168.1.89");
//正式绑定
//成功返回0,失败返回-1
if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0){
perror("bind error\n");
exit(1);
}
printf("bind success!\n");
//监听套接字上的连接
//成功返回0,失败返回-1
//int listen(int sockfd, int backlog)
//sockfd:文件描述符
//backlog:参数定义的最大长度
#if 1
if( listen(sockfd,5) < 0 ){
perror("listen error\n");
exit(1);
}
printf("listen success!\n");
#endif
printf("accept loading!\n");
//等待三次握手第二次,获得new_fd,就是对第二次握手消息的确认
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//接受套接字上的连接:struct sockaddr_in client_addr,接受客户端的连接
int ser_size = sizeof client_addr;
if( (new_fd = accept(sockfd,(struct sockaddr *)&client_addr,(socklen_t *)&ser_size)) < 0){
perror("accept error!\n");
exit(1);
}
printf("accept success!\n");
while(1){
printf("read loading\n");
//从文件描述符读取数据
//ssize_t read(int fd, void *buf, size_t count);
n_read = read(new_fd,buffer,sizeof(buffer));
if(n_read <= 0){
perror("read client message error");
exit(1);
}
buffer[n_read] = '\0';
printf("read msg = %s\n",buffer);
}
return 0;
}
linux下通信服务器端(普通)
最新推荐文章于 2023-03-04 18:58:38 发布