服务端:
/*
* TCP/IP server.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h> //定义了UNIX socket 地址结构
#include <netinet/in.h> //定义了IPv4和IPv6的地址格式
#define MAXLENE 80
#define SERV_PORT 8002
int main(void)
{
struct sockaddr_in servaddr, cliaddr; //IPv4地址结构体
socklen_t cliaddr_len;
int listenfd, connfd;
char buf[MAXLENE];
char str[INET_ADDRSTRLEN];
int i, n;
listenfd = socket(AF_INET, SOCK_STREAM, 0);//打开一个IPV4网络通信端口,对于TCP协议 SOCK_STREAM ,UDP协议SOCK_DGRAM
bzero(&servaddr, sizeof(servaddr));//先将整个地址结构体清0
servaddr.sin_family = AF_INET;//设置本地地址类型为AF_INET,IPV4指定的类型
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//网络地址为INADDR_ANY,表示本地任意IP
servaddr.sin_port = htons(SERV_PORT);//设置端口号为8000
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));//bind()的作用是将参数sockfd和myaddr绑定在一起
//使这个sockfd用于网络通讯的文件描述符监听myaddr所描述的地址和端口号
listen(listenfd, 20);//listen()声明sockfd处于监听状态,并且最多允许有20个客户端处于待连接状态,成功返回0,失败返回-1
printf("Accepting connections ...\n");
while (1) {
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd,
(struct sockaddr *)&cliaddr, &cliaddr_len);
n = read(connfd, buf, MAXLENE);
printf("received from %d at PORT %d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
ntohs(cliaddr.sin_port));
printf("Recive from Client:%d\n",n);
for(int i = 0; i < n; i++){
printf("%c ",buf[i]);
}
printf("\n");
write(connfd, buf, n);
close(connfd);
}
}
客户端:
/*
*TCP/IP client.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8002
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd, n;
char *str = NULL;
if(argc !=2){
fputs("usage: ./client message \n",stderr);
exit(1);
}
str = argv[1];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET,"10.19.194.187", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
connect(sockfd, (struct sockaddr *)&servaddr ,sizeof(servaddr));
write(sockfd, str, strlen(str));
n = read(sockfd, buf, MAXLINE);
printf("response from server:%d\n",n);
for(int i = 0; i < n; i++){
printf("%c ",buf[i]);
}
printf("\n");
write(STDOUT_FILENO,buf, n);
close(sockfd);
return 0;
}