目录
一.搭建
1.socket
int fd;
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd < 0)
{
perror("socket");
return -1;
}
1.1快速地址复用
int optval = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int));
2.bind
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
#if 0
addr.sin_addr.s_addr = inet_addr(ip);
#else
ret = inet_pton(AF_INET, ip, (void *)&addr.sin_addr);
if(ret != 1)
{
perror("inet_pton");
return -1;
}
#endif
ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
if(ret < 0)
{
perror("bind");
return -1;
}
3.listen
ret = listen(fd, 5);
if(ret < 0)
{
perror("listen");
return -1;
}
4.accept
if((acceptfd = accept(fd, (struct sockaddr *)&addr_s, &add_lenth)) < 0 )
{
perror("accept");
break;
}
5.read
while(1)
{
bzero (buf, sizeof(buf));
do{
ret = read(acceptfd , buf, 1024);
}while(ret < 0);
if(ret < 0)
{
perror("read");
return -1;
}
if(!ret)
{
break;
}
printf("client %d,rcv>>> %s",acceptfd,buf);
if (!strncasecmp (buf, "quit", 4)) { //用户输入了quit字符
printf ("Client(fd=%d) is exiting!\n", acceptfd);
break;
}
}
二.程序
1.sever.c
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>
#define port 5001
#define ip "192.168.43.100"
void *handle(void *arg)
{
int ret;
char buf[1024];
int acceptfd = *(int *)arg;
pthread_detach(pthread_self());
while(1)
{
do{
ret = read(acceptfd, buf, 1024);
}while(ret < 0);
if(ret < 0)
{
perror("read");
return NULL;
}
if(!ret)
{
break;
}
printf("<fd:%d> client rcv>>> %s",acceptfd,buf);
}
close(acceptfd);
pthread_exit(NULL);
}
int main(int argc,char *argv[])
{
/*
if(argc != 3)
{
printf("%s <port> <ip>\n", __FILE__);
return -1;
}
if(port < 5000)
{
printf("port > 5000\n");
return -1;
}
*/
// printf("port = %s, ip = %s\n",port,ip);
int fd,acceptfd;
int ret;
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd < 0)
{
perror("socket");
return -1;
}
int optval = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int));
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
#if 0
addr.sin_addr.s_addr = inet_addr(ip);
#else
ret = inet_pton(AF_INET, ip, (void *)&addr.sin_addr);
if(ret != 1)
{
perror("inet_pton");
return -1;
}
#endif
ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
if(ret < 0)
{
perror("bind");
return -1;
}
ret = listen(fd, 5);
if(ret < 0)
{
perror("listen");
return -1;
}
char ch[16];
struct sockaddr_in addr_s;
socklen_t add_lenth = sizeof(struct sockaddr_in);
printf("sever start >>>>\n");
while(1)
{
acceptfd = accept(fd, (struct sockaddr *)&addr_s, &add_lenth);
printf("<fd:%d> client:(%d:%s)\n",acceptfd,ntohs(addr_s.sin_port), inet_ntop(AF_INET,(void *)&addr_s.sin_addr, ch, 16));
pthread_t tid;
pthread_create(&tid, NULL, handle, (void *)&acceptfd);
}
close(fd);
}
2.client.c
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#define port atoi(argv[1])
#define ip argv[2]
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("%s <port> <ip>\n", __FILE__);
return -1;
}
if(port < 5000)
{
printf("port > 5000\n");
return -1;
}
// printf("port = %s, ip = %s\n",port,ip);
int fd;
int ret;
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd < 0)
{
perror("socket");
return -1;
}
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip);
ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
if(ret < 0)
{
perror("connect");
return -1;
}
printf("client start >>>>\n");
char buf[1024];
while(1)
{
bzero(buf, sizeof(buf));
printf(">");
fgets(buf, 1024, stdin);
write(fd, buf, sizeof(buf));
if((strncmp(buf, "quit", 4)) == 0)
{
printf("client quit\n");
close(fd);
exit(1);
}
}
close(fd);
}
3.编译结果

本文详细介绍了使用C语言通过socket编程创建一个简单的TCP服务器和客户端,包括socket初始化、地址复用、bind、listen、accept和read操作,以及server.c和client.c程序的实现和编译结果。
1309





