测试代码为一个简单的回显程序
客户端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAXLINE 4096
#define PORT 9000
#define HOST "0.0.0.0"
int bind_listen()
{
int listenfd;
struct sockaddr_in servaddr;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
return -1;
}
memset(&servaddr, 0x00, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, HOST, &servaddr.sin_addr) == -1) {
close(listenfd);
perror("inet_pton");
return -1;
}
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
close(listenfd);
perror("bind");
return -1;
}
if (listen(listenfd, 20) == -1) {
close(listenfd);
perror("listen");
return -1;
}
return listenfd;
}
void do_something(int sockfd)
{
int recvlen;
char buf[MAXLINE];
while ((recvlen = read(sockfd, buf, MAXLINE)) > 0) {
if (write(sockfd, buf, recvlen) < 0) {
perror("write");
return;
}
}
if (recvlen == -1) {
perror("read");
} else if (recvlen == 0) {
fprintf(stderr, "read EOF\n");
}
}
int main(int argc, char **argv)
{
int listenfd, connfd;
char straddr[INET_ADDRSTRLEN];
socklen_t cliaddrlen;
struct sockaddr_in cliaddr;
if ((listenfd = bind_listen()) == -1) {
fprintf(stderr, "bind_listen error");
exit(EXIT_FAILURE);
}
while (1) {
cliaddrlen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen);
if (connfd == -1) {
perror("accept");
continue;
}
fprintf(stderr, "connect from %s at PORT %d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, straddr, sizeof(straddr)),
ntohs(cliaddr.sin_port));
do_something(connfd);
close(connfd);
fprintf(stderr, "close connfd\n");
}
return 0;
}
服务端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAXLINE 4096
#define PORT 9000
int connect_server(const char *straddr)
{
int sockfd;
struct sockaddr_in servaddr;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
return -1;
}
memset(&servaddr, 0x00, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, straddr, &servaddr.sin_addr) == -1) {
perror("inet_pton");
return -1;
}
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
close(sockfd);
perror("connect");
return -1;
}
return sockfd;
}
void do_something(int sockfd)
{
char sendbuf[MAXLINE], recvbuf[MAXLINE];
int sendlen, recvlen;
while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL) {
sendlen = strlen(sendbuf);
if (write(sockfd, sendbuf, sendlen) == -1) {
perror("write");
return;
}
if ((recvlen = read(sockfd, recvbuf, sizeof(recvbuf)-1)) < 0) {
perror("read");
return;
} else if(recvlen == 0) {
fprintf(stderr, "str_cli: read EOF\n");
return;
}
recvbuf[recvlen] = '\0';
fputs(recvbuf, stdout);
}
}
int main(int argc, char **argv)
{
int sockfd;
if (argc != 2) {
fprintf(stderr, "usage: tcpcli <IPaddress>\n");
return 0;
}
sockfd = connect_server(argv[1]);
if (sockfd == -1) {
fprintf(stderr, "connect_server %s error\n", argv[1]);
exit(EXIT_FAILURE);
}
do_something(sockfd);
close(sockfd);
fprintf(stderr, "close sockfd\n");
return 0;
}