127 lines
2.2 KiB
C
127 lines
2.2 KiB
C
#include <sys/stat.h>
|
||
#include <fcntl.h>
|
||
#include <errno.h>
|
||
#include <netdb.h>
|
||
#include <sys/types.h>
|
||
#include <sys/socket.h>
|
||
#include <netinet/in.h>
|
||
#include <arpa/inet.h>
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
|
||
|
||
/*
|
||
监听后,一直处于accept阻塞状态,
|
||
直到有客户端连接,
|
||
当客户端如数quit后,断开与客户端的连接
|
||
*/
|
||
|
||
int main(int args, char** argv)
|
||
{
|
||
int fd;
|
||
struct sockaddr_in server_addr;
|
||
struct sockaddr_in clientAddr;
|
||
int addr_len = sizeof(clientAddr);
|
||
int client;
|
||
char buffer[200];
|
||
int iDataNum;
|
||
|
||
char ip[] = "192.168.209.193";
|
||
char *str = ip;
|
||
uint16_t port = 61;
|
||
|
||
|
||
|
||
//建立socket
|
||
fd = socket(AF_INET, SOCK_STREAM, 0);
|
||
if(fd == -1)
|
||
{
|
||
printf("socket failed");
|
||
return -1;
|
||
}
|
||
|
||
bzero(&server_addr, sizeof(server_addr));
|
||
|
||
server_addr.sin_family = AF_INET;
|
||
server_addr.sin_port = htons(port);
|
||
printf("the value of str:%s\n", str);
|
||
//将IP地址转换成网络字节序
|
||
int ret = inet_pton(AF_INET, str, &server_addr.sin_addr);
|
||
printf("the value of ret is:%d\n",ret);
|
||
printf("inet_pton:0x%x\n", server_addr.sin_addr.s_addr);
|
||
if(ret < 0)
|
||
{
|
||
printf("error");
|
||
return -1;
|
||
}
|
||
|
||
int i = bind(fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
|
||
printf("the value of i is :%d\n", i);
|
||
if(i < 0)
|
||
{
|
||
printf("bind error");
|
||
return -1;
|
||
}
|
||
|
||
//开启监听,第二个参数是最大监听数
|
||
listen(fd,5);
|
||
if(listen(fd, 5) < 0)
|
||
{
|
||
printf("listen error");
|
||
return -1;
|
||
}
|
||
|
||
while(1)
|
||
{
|
||
printf("监听端口: %d\n", port);
|
||
client = accept(fd, (struct sockaddr*)&clientAddr, (socklen_t*)&addr_len);
|
||
|
||
if(client < 0)
|
||
{
|
||
printf("accept error");
|
||
continue;
|
||
}
|
||
|
||
printf("等待消息...\n");
|
||
printf("IP is %s\n", inet_ntoa(clientAddr.sin_addr));
|
||
printf("Port is %d\n", htons(clientAddr.sin_port));
|
||
|
||
while(1)
|
||
{
|
||
printf("读取消息:");
|
||
buffer[0] = '\0';
|
||
iDataNum = recv(client, buffer, 1024, 0);
|
||
if(iDataNum < 0)
|
||
{
|
||
printf("recv null");
|
||
continue;
|
||
}
|
||
buffer[iDataNum] = '\0';
|
||
if(strcmp(buffer, "quit") == 0)
|
||
break;
|
||
printf("%s\n", buffer);
|
||
|
||
|
||
printf("发送消息:");
|
||
scanf("%s", buffer);
|
||
printf("\n");
|
||
send(client, buffer, strlen(buffer), 0);
|
||
if(strcmp(buffer, "quit") == 0)
|
||
break;
|
||
}
|
||
}
|
||
|
||
close(fd);
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|