分类: LINUX
2016-11-22 21:04:54
一个简单的服务器监听程序模型,旨在演示相关函数的用法,Linux3.13下编译通过。
#include
#include
#include
#include
#include
#include
/*TCP接口信息*/
struct tcp_info {
short sCommType; /*类型:0 TCP*/
unsigned long ulIPAddr; /*相关类型的IP*/
unsigned short usPort; /*相关类型的端口*/
};
/*服务端TCP信息*/
typedef struct tcp_info server_info;
/*客户端TCP信息*/
typedef struct tcp_info client_info;
/*解析客户端IP用*/
typedef union __endian_long_tag {
struct {
unsigned char A;
unsigned char B;
unsigned char C;
unsigned char D;
} Byte;
unsigned long Dword;
} DWORDENDIAN;
#define SERVER_IP "192.168.1.103" //服务器IP
#define SERVER_PORT "1235" //端口号,自行定义
int CreateTCP(server_info *server)
{
struct sockaddr_in sin;
int iLen;
int iConnID;
iLen = (int)(sizeof(struct sockaddr_in));
memset(&sin, 0, iLen);
if (server->sCommType != 0) {
printf("Not TCP type!\n");
return -1;
}
iConnID = socket(PF_INET, SOCK_STREAM, 0);
if (iConnID < 0) {
printf("TCP:Create socket error:[%s]!\n", (char *)strerror(errno));\
return -1;
}
const int REBINDON = 1;
setsockopt(iConnID, SOL_SOCKET, SO_REUSEADDR, &REBINDON, sizeof(REBINDON));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = (unsigned long)(server->ulIPAddr);
sin.sin_port = htons(server->usPort);
if (bind(iConnID, (const struct sockaddr *)&sin, iLen) < 0) {
printf("TCP:Bind Server IP or port error:[%s]!\n", (char *)strerror(errno));
return -1;
}
if (listen(iConnID, 5) < 0) {
printf("TCP:Listen Server socket error:[%s]!\n", (char *)strerror(errno));
return -1;
}
return iConnID;
}
int main(void)
{
int iFd;
int iClifd;
server_info server;
client_info client;
memset(&server, 0, sizeof(server_info));
memset(&client, 0, sizeof(client_info));
server.sCommType = 0;
server.ulIPAddr = inet_addr(SERVER_IP);
server.usPort = atoi(SERVER_PORT);
printf("father_pid=[%d]\n", getpid());
iFd = CreateTCP(&server);
if (iFd < 0) {
printf("CreateTCP error!\n");
return 1;
}
client.sCommType = 0;
sleep(3);
while(1) {
struct sockaddr_in sin;
int iLen;
iLen = (int)(sizeof(struct sockaddr_in));
memset(&sin, 0, iLen);
iClifd = accept(iFd, (struct sockaddr *)&sin, &iLen);
if (iClifd < 0)
continue;
if (fork() == 0) {
DWORDENDIAN nIps;
char clientsource[15];
memset(clientsource, 0, sizeof(clientsource));
iFd = -1;
nIps.Dword = sin.sin_addr.s_addr;
printf("child_pid=[%d]\n", getpid());
sprintf(clientsource, "%3.3d%3.3d%3.3d%3.3d", nIps.Byte.A, nIps.Byte.B, nIps.Byte.C, nIps.Byte.D);
printf("clientsource=[%s]\n", clientsource);
}
}
}
文件保存为server.c,执行”gcc
server.c”,执行./a.out后,使用TCP助手连接,每次连接可看到客户端IP。
头文件不显示,附上帖子地址: