- 论坛徽章:
- 0
|
回复 #1 luoleicn 的帖子
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/fcntl.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/resource.h>
#define MAXBUF 1024
int set_noblock_socket(int sockfd)
{
if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1) {
return -1;
}
return 0;
}
int handle_message(int sockfd)
{
int len = 1;
char buff[MAXBUF+1] = {0};
while (len != 0)
{
len = recv(sockfd, buff, MAXBUF, 0);
if (len < 0) {
perror("recv error");
close(sockfd);
return -1;
} else if (len > 0) {
printf("Recved:%s, and len is:%d \n", buff, len);
len = send(sockfd, buff, len, 0);
if (len < 0) {
perror("send error");
close(sockfd);
}
memset(buff, 0, MAXBUF);
} else { //==0
printf("Disconnected by peer!\n");
close(sockfd);
return -1;
}
}
return len;
}
int main()
{
int n, srv_sock, client_sock, ret;
socklen_t len;
unsigned int serv_port;
struct sockaddr_in serv_addr, cli_addr;
if ((srv_sock = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
return -1;
}
bzero(&serv_addr, sizeof(struct sockaddr_in));
serv_addr.sin_family = PF_INET;
serv_addr.sin_port = htons(32321);
serv_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(srv_sock, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) {
perror("bind");
close(srv_sock);
return -1;
}
if (listen(srv_sock, 5) < 0){
perror("listen");
close(srv_sock);
return -1;
}
while (1) {
client_sock = accept(srv_sock, (struct sockaddr *)&cli_addr, &len);
if (client_sock < 0) {
perror("accept");
continue;
} else {
printf("connect from:%s:%d\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));
}
ret = handle_message(client_sock);
if (ret < 0) {
printf("handle_message error\n");
}
printf("handle over\n");
}
close(srv_sock);
return 0;
} |
|