简单socket服务器客户端

来源:互联网 发布:男士服装搭配软件 编辑:程序博客网 时间:2024/05/22 06:49
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

#define SERVPORT 8088

#define SERVER

#ifdef SERVER
int main(void) {

int sockfd, client_sockfd;
struct sockaddr_in tsock_addr, tclient_addr;

memset(&tsock_addr, 0x0, sizeof(structsockaddr_in));
tsock_addr.sin_port = htons(SERVPORT);
tsock_addr.sin_addr.s_addr = INADDR_ANY;
tsock_addr.sin_family = AF_INET;

if(-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))){
perror("socket create error:");
return -1;
}

if(-1 == bind(sockfd, (structsockaddr*)&tsock_addr, sizeof(structsockaddr))){
perror("bind error:");
close(sockfd);
return -1;
}

if(-1 == listen(sockfd, 10)){
perror("listen error");
close(sockfd);
return -1;
}

printf("server listening...\n");
while(1){
unsigned lsize = (sizeof(struct sockaddr));
if(-1 == (client_sockfd = accept(sockfd, (struct sockaddr*)&tclient_addr, &lsize))){
perror("accept error:");
close(sockfd);
return -1;
}
char *psRet = inet_ntoa(tclient_addr.sin_addr);
printf("received a connection from %s \n", psRet);

int bytes;
char sBuf[1024] = {0};
if(-1 == (bytes = recv(client_sockfd, sBuf, 1024, 0))){
perror("recv error:");
close(sockfd);
return -1;;
}
printf("%s", sBuf);


signal(SIGCHLD, SIG_IGN);
pid_t pid = fork();
if(0 == pid){
char *psBuf = (char *)calloc(1, 1024);
strncpy(psBuf, "connect successfully\n", 1024);
if(-1 == send(client_sockfd, psBuf, strlen(psBuf) + 1,0)){
perror("send error");
}
close(client_sockfd);
free(psBuf);
close(sockfd);
exit(0);
}
close(client_sockfd);

}
return EXIT_SUCCESS;
}
#else
#include <netdb.h>
int main()
{
//these four lines are used for testing herror
if(NULL == gethostbyname("localhost")){
herror("get host error"); //not perror, but herror
return -1;
}
int sockfd;
struct sockaddr_in tsock_addr;
memset(&tsock_addr, 0x0, sizeof(structsockaddr_in));
tsock_addr.sin_port = htons(SERVPORT);
tsock_addr.sin_addr.s_addr = INADDR_ANY;
tsock_addr.sin_family = AF_INET;


if(-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))){
perror("socket create error:");
return -1;
}

if(0 != connect(sockfd, (struct sockaddr*)&tsock_addr, sizeof(struct sockaddr))){
perror("connect error:");
close(sockfd);
return -1;
}

char *psBuf = (char *)calloc(1, 1024);
printf("please input:\n");
fgets(psBuf, 1024, stdin);
if(-1 == send(sockfd, psBuf, strlen(psBuf) + 1, 0)){
perror("send error");
}
free(psBuf);

char sBuf[1024] = {0};
int bytes;
if(-1 == (bytes = recv(sockfd, sBuf, 1024, 0))){
perror("recv error:");
close(sockfd);
return -1;;
}
printf("%s\n", sBuf);
close(sockfd);
return 0;
}

#endif