socket server:
int main(int argc, char* argv[]) {
int sockfd, connfd;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("socket create error!");
exit(-1);
}
int reuse = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
struct sockaddr_in serverAddr;
bzero(&serverAddr, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = INADDR_ANY; //inet_addr(OPEN_HOST);
if (bind(sockfd , (struct sockaddr*) &serverAddr, sizeof(serverAddr)) != 0){
perror("bind error!");
close(sockfd);
exit(-1);
}
if (listen(sockfd , BACKLOG) != 0){
perror("listen error!");
close(sockfd);
exit(-1);
}
signal(SIGALRM, colseSockTimeout);
while (1) {
struct sockaddr_in clientAddr;
int clientAddrLen = sizeof(clientAddr);
if((connfd = accept(sockfd , (struct sockaddr*) &clientAddr, &clientAddrLen)) < 0){
perror("accept error!");
continue;
}
char * childAddr = (char *)inet_ntoa(clientAddr.sin_addr);
int childPort = htons(clientAddr.sin_port);
//printf("Client %d (IP:%s/PORT:%d) is connected!\n", connfd, childAddr, childPort);
signal(SIGCHLD, SIG_IGN);
pid_t pid = fork();
if (pid == 0) {
char recvMsg[MAXDATASIZE];
char sendMsg[MAXDATASIZE];
char buff[MAXDATASIZE];
close(sockfd);
while(1) {
temp_connfd = connfd;
alarm(SOCK_TIMEOUT);
bzero(recvMsg, sizeof(recvMsg));
if (recv(connfd, recvMsg, sizeof(recvMsg), 0) <= 0) {
//printf("Client %d (IP:%s/PORT:%d) closed!\n", connfd, childAddr, childPort);
close(connfd);
exit(0);
}
alarm(0);
bzero(buff, sizeof(buff));
removeWrap(recvMsg, buff);
sprintf(sendMsg, "Message: %s, send successed!\r\n", buff);
printf("Client %d (IP:%s/PORT:%d) say:%s\r\n", connfd, childAddr, childPort, buff);
printf("Server say:%s\n", sendMsg);
send(connfd, sendMsg, strlen(sendMsg), 0);
close(connfd);
}
} else if(pid > 0) {
close(connfd);
} else {
perror("fork error!");
exit(-1);
}
}
close(sockfd);
return 0;
}
socket client:
int main(int argc, char* argv[]) {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT);
serveraddr.sin_addr.s_addr = inet_addr(LOACL_HOST);
connect(sockfd, (struct sockaddr*) &serveraddr, sizeof(serveraddr));
while(1){
char buf[MAXDATASIZE];
char sendMsg[MAXDATASIZE];
bzero(buf, sizeof(buf));
printf("input:");
fgets(buf, sizeof(buf), stdin);
send(sockfd, buf, sizeof(buf), 0);
bzero(buf, sizeof(buf));
recv(sockfd, buf, sizeof(buf), 0);
fputs(buf, stdout);
}
close(sockfd);
return 0;
}