代码段一
#include <stdio.h>
#include <string.h>
#include <sys/socket.h> //套接子
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h> //htons 主机字节序-》网络字节序
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/time.h>//无收发且判断方法初级(有漏洞)
#define ERR_MSG(msg) \
do \
{ \
fprintf(stderr, "_%s_ _%s_ _%d_\n", __FILE__, __func__, __LINE__); \
perror(msg); \
} while (0)
#define IP "192.168.31.131"
#define PORT 6666
int main()
{
//创建流式套接子
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd < 0)
{
ERR_MSG("socket");
return -1;
}
printf("socket success sfd=%d\n", sfd);
//允许端口快速被覆盖重用
int reuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速被覆盖重用成功\n");
//填充地址信息结构体,通过man 7 IP
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
//绑定服务器的地址信息
if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success __%d__\n", __LINE__);
//将套接子设置为被动监听状态
if (listen(sfd, 128) < 0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success __%d__\n", __LINE__);
//--------------------------------------
//创建一个读集合
fd_set readfds;
//清空集合
FD_ZERO(&readfds);
//添加集合
// FD_SET(0, &readfds);
// FD_SET(sfd, &readfds);
int s_res = 0;
//-----------------------------------
struct sockaddr_in cin; //存储客户端地址信息
socklen_t addrlen = sizeof(cin);
int newfd = -1;
char buf[128] = "";
ssize_t res = 0;
while (1)
{
FD_SET(0, &readfds);
FD_SET(sfd, &readfds);
//三个集合中最大的文件描述符+1
s_res = select(sfd + 1, &readfds, NULL, NULL, NULL);
if (s_res < 0)//失败
{
ERR_MSG("select");
return -1;
}
else if (0 == s_res)//超时
{
printf("time out...\n");
break;
}
printf("_%d_\n", __LINE__);
if(FD_ISSET(0,&readfds))
{
printf("触发键盘输入:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
printf("buf=%s\n",buf);
}
if(FD_ISSET(sfd,&readfds))
{
printf("触发客户端连接\n");
//生成新的文件描述符与客户通信
newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
if(newfd<0)
{
ERR_MSG("accept");
return -1;
}
printf("[%s:%d] newfd=%d 客户端连接成功 _%d_\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
}
}
if (close(sfd) < 0)
{
ERR_MSG("close");
return -1;
}
return 0;
}
代码段二
#include <stdio.h>
#include <string.h>
#include <sys/socket.h> //套接子
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h> //htons 主机字节序-》网络字节序
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/time.h>//无收发且判断方法初级(有漏洞)
#define ERR_MSG(msg) \
do \
{ \
fprintf(stderr, "_%s_ _%s_ _%d_\n", __FILE__, __func__, __LINE__); \
perror(msg); \
} while (0)
#define IP "192.168.31.131"
#define PORT 6666
int main()
{
//创建流式套接子
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd < 0)
{
ERR_MSG("socket");
return -1;
}
printf("socket success sfd=%d\n", sfd);
//允许端口快速被覆盖重用
int reuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速被覆盖重用成功\n");
//填充地址信息结构体,通过man 7 IP
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
//绑定服务器的地址信息
if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success __%d__\n", __LINE__);
//将套接子设置为被动监听状态
if (listen(sfd, 128) < 0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success __%d__\n", __LINE__);
//--------------------------------------
//创建一个读集合
fd_set readfds;
//清空集合
FD_ZERO(&readfds);
//添加集合
// FD_SET(0, &readfds);
// FD_SET(sfd, &readfds);
int s_res = 0;
//-----------------------------------
struct sockaddr_in cin; //存储客户端地址信息
socklen_t addrlen = sizeof(cin);
int newfd = -1;
char buf[128] = "";
ssize_t res = 0;
while (1)
{
FD_SET(0, &readfds);
FD_SET(sfd, &readfds);
//三个集合中最大的文件描述符+1
s_res = select(sfd + 1, &readfds, NULL, NULL, NULL);
if (s_res < 0)//失败
{
ERR_MSG("select");
return -1;
}
else if (0 == s_res)//超时
{
printf("time out...\n");
break;
}
printf("_%d_\n", __LINE__);
if(FD_ISSET(0,&readfds))
{
printf("触发键盘输入:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
printf("buf=%s\n",buf);
}
if(FD_ISSET(sfd,&readfds))
{
printf("触发客户端连接\n");
//生成新的文件描述符与客户通信
newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
if(newfd<0)
{
ERR_MSG("accept");
return -1;
}
printf("[%s:%d] newfd=%d 客户端连接成功 _%d_\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
}
}
if (close(sfd) < 0)
{
ERR_MSG("close");
return -1;
}
return 0;
}
代码段三
#include <stdio.h>
#include <string.h>
#include <sys/socket.h> //套接子
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h> //htons 主机字节序-》网络字节序
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/time.h>//无收发且判断方法初级(有漏洞)
#define ERR_MSG(msg) \
do \
{ \
fprintf(stderr, "_%s_ _%s_ _%d_\n", __FILE__, __func__, __LINE__); \
perror(msg); \
} while (0)
#define IP "192.168.31.131"
#define PORT 6666
int main()
{
//创建流式套接子
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd < 0)
{
ERR_MSG("socket");
return -1;
}
printf("socket success sfd=%d\n", sfd);
//允许端口快速被覆盖重用
int reuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速被覆盖重用成功\n");
//填充地址信息结构体,通过man 7 IP
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
//绑定服务器的地址信息
if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success __%d__\n", __LINE__);
//将套接子设置为被动监听状态
if (listen(sfd, 128) < 0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success __%d__\n", __LINE__);
//--------------------------------------
//创建一个读集合
fd_set readfds;
//清空集合
FD_ZERO(&readfds);
//添加集合
// FD_SET(0, &readfds);
// FD_SET(sfd, &readfds);
int s_res = 0;
//-----------------------------------
struct sockaddr_in cin; //存储客户端地址信息
socklen_t addrlen = sizeof(cin);
int newfd = -1;
char buf[128] = "";
ssize_t res = 0;
while (1)
{
FD_SET(0, &readfds);
FD_SET(sfd, &readfds);
//三个集合中最大的文件描述符+1
s_res = select(sfd + 1, &readfds, NULL, NULL, NULL);
if (s_res < 0)//失败
{
ERR_MSG("select");
return -1;
}
else if (0 == s_res)//超时
{
printf("time out...\n");
break;
}
printf("_%d_\n", __LINE__);
if(FD_ISSET(0,&readfds))
{
printf("触发键盘输入:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
printf("buf=%s\n",buf);
}
if(FD_ISSET(sfd,&readfds))
{
printf("触发客户端连接\n");
//生成新的文件描述符与客户通信
newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
if(newfd<0)
{
ERR_MSG("accept");
return -1;
}
printf("[%s:%d] newfd=%d 客户端连接成功 _%d_\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
}
}
if (close(sfd) < 0)
{
ERR_MSG("close");
return -1;
}
return 0;
}
代码段四
#include <stdio.h>
#include <string.h>
#include <sys/socket.h> //套接子
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h> //htons 主机字节序-》网络字节序
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/time.h>//无收发且判断方法初级(有漏洞)
#define ERR_MSG(msg) \
do \
{ \
fprintf(stderr, "_%s_ _%s_ _%d_\n", __FILE__, __func__, __LINE__); \
perror(msg); \
} while (0)
#define IP "192.168.31.131"
#define PORT 6666
int main()
{
//创建流式套接子
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd < 0)
{
ERR_MSG("socket");
return -1;
}
printf("socket success sfd=%d\n", sfd);
//允许端口快速被覆盖重用
int reuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速被覆盖重用成功\n");
//填充地址信息结构体,通过man 7 IP
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
//绑定服务器的地址信息
if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success __%d__\n", __LINE__);
//将套接子设置为被动监听状态
if (listen(sfd, 128) < 0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success __%d__\n", __LINE__);
//--------------------------------------
//创建一个读集合
fd_set readfds;
//清空集合
FD_ZERO(&readfds);
//添加集合
// FD_SET(0, &readfds);
// FD_SET(sfd, &readfds);
int s_res = 0;
//-----------------------------------
struct sockaddr_in cin; //存储客户端地址信息
socklen_t addrlen = sizeof(cin);
int newfd = -1;
char buf[128] = "";
ssize_t res = 0;
while (1)
{
FD_SET(0, &readfds);
FD_SET(sfd, &readfds);
//三个集合中最大的文件描述符+1
s_res = select(sfd + 1, &readfds, NULL, NULL, NULL);
if (s_res < 0)//失败
{
ERR_MSG("select");
return -1;
}
else if (0 == s_res)//超时
{
printf("time out...\n");
break;
}
printf("_%d_\n", __LINE__);
if(FD_ISSET(0,&readfds))
{
printf("触发键盘输入:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
printf("buf=%s\n",buf);
}
if(FD_ISSET(sfd,&readfds))
{
printf("触发客户端连接\n");
//生成新的文件描述符与客户通信
newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
if(newfd<0)
{
ERR_MSG("accept");
return -1;
}
printf("[%s:%d] newfd=%d 客户端连接成功 _%d_\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
}
}
if (close(sfd) < 0)
{
ERR_MSG("close");
return -1;
}
return 0;
}