给初学socket编程的人看的
Server端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#define port 8890
#define MAX_BUF_SIZE 1024
void dealMessag(int new_fd) {
while (1) {
int nbytes = 0;
char buffer[MAX_BUF_SIZE];
if ((nbytes = read(new_fd, buffer, MAX_BUF_SIZE)) < 0) {
perror("read error");
exit(1);
}
if (strcmp(buffer, "exit") == 0 || strcmp(buffer, "") == 0) {
exit(1);
}
buffer[nbytes] = '\0';
printf("Data is %s\n", buffer);
if (write(new_fd, buffer, strlen(buffer)) < 0) {
perror("write error");
exit(1);
}
}
}
int main(int argc, char *argv[]) {
int sockfd, new_fd, listenfd;
pid_t childpid;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("sock error");
exit(1);
}
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *) &server_addr,
sizeof(struct sockaddr)) < 0) {
perror("bind error");
exit(1);
}
if ((listenfd = listen(sockfd, 5)) < 0) {
perror("listen error");
exit(1);
}
while (1) {
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *) &client_addr,
(socklen_t *) &sin_size)) < 0) {
perror("accept error");
exit(1);
}
if ((childpid = fork()) == 0) {
close(listenfd);
dealMessag(new_fd);
exit(0);
}
close(new_fd);
}
close(sockfd);
exit(0);
}
Client 端
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
void BusinessDeal(int sockfd);
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber;
if (argc != 3) {
fprintf(stderr, "Usage:%s hostname portnumber\a\n", argv[0]);
exit(1);
}
if ((host = gethostbyname(argv[1])) == NULL) {
fprintf(stderr, "Gethostname error\n");
exit(1);
}
if ((portnumber = atoi(argv[2])) < 0) {
fprintf(stderr, "Usage:%s hostname portnumber\a\n", argv[0]);
exit(1);
}
/* 客户程序开始建立 sockfd描述符 */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "Socket Error:%s\a\n", strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnumber);
server_addr.sin_addr = *((struct in_addr *) host->h_addr);
/* 客户程序发起连接请求 */
if (connect(sockfd, (struct sockaddr *) (&server_addr),
sizeof(struct sockaddr)) == -1) {
fprintf(stderr, "Connect Error:%s\a\n", strerror(errno));
exit(1);
}
BusinessDeal(sockfd);
/* 结束通讯 */
close(sockfd);
exit(0);
}
void BusinessDeal(int sockfd) {
while (1) {
int nbytes = 0;
char buffer[1024];
printf("(Please input your command )>>");
scanf("%s", buffer);
if (strcmp(buffer, "exit") == 0) {
write(sockfd, "exit", 1024);
exit(1);
}
if (write(sockfd, buffer, 1024) < 0) {
perror("write error");
exit(1);
}
if ((nbytes = read(sockfd, buffer, strlen(buffer))) < 0) {
perror("read error");
exit(1);
}
buffer[nbytes] = '\0';
printf("I received data from server : %s\n", buffer);
}
}