编写服务器和客户端程序,完成可以从客户端 向服务器端发送用户输入的信息;
客户端:获取用户输入并发送给服务器
服务器:从套接字获取数据并打印输出
当双方遇到"quit" 的时候同时退出;
使用tcp协议
服务器
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc!=3)
{
printf("Usage %s [ip] [port]\n",argv[0]);
return -1;
}
char buff[128] ={0};
int ret = 0,connfd = 0;
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket");
return -1;
}
int on=1;//设置端口复用
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
struct sockaddr_in addr ;
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
addr.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t len = sizeof(addr);
ret = bind(sockfd, (struct sockaddr*) &addr, len);
if(ret < 0)
{
perror("bind");
return -2;
}
listen(sockfd,100);
// connfd = accept(sockfd,NULL,NULL);
struct sockaddr_in cliaddr; ///要获取客户端信息
connfd = accept(sockfd,(struct sockaddr*)&cliaddr,&len);
printf("客户端 ip = %s \n ", inet_ntoa(cliaddr.sin_addr));
printf("客户端 port = %d \n", ntohs(cliaddr.sin_port));
if(connfd < 0)
{
perror("accept");
return -3;
}
printf("client connect in..... \n");
while(1)
{
bzero(buff,sizeof(buff));
ret = recv(connfd,buff,sizeof(buff),0);
if(ret < 0)
{
perror("recv");
return -4;
}
else
{
if(strcmp(buff,"quit")==0) break;
if(strcmp(buff,"quit\n")==0) break;
printf("recv buff = %s \n",buff);
}
}
close(connfd);
close(sockfd);
return 0;
}
客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc!=4)
{
printf("Usage %s [dst_ip] [dst_port] [src_port] \n",argv[0]);
return -1;
}
char buff[128] ={0};
int ret = 0,connfd = 0;
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket");
return -1;
}
int on=1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
struct sockaddr_in myaddr ;
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(atoi(argv[3]));
socklen_t len = sizeof(myaddr);
ret = bind(sockfd, (struct sockaddr*) &myaddr, len);
if(ret < 0)
{
perror("bind");
return -4;
}
struct sockaddr_in addr ;
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
addr.sin_addr.s_addr = inet_addr(argv[1]);
len = sizeof(addr);
ret = connect(sockfd,(struct sockaddr *)&addr,len);
if(ret < 0)
{
perror("connect");
return -2;
}
while(1)
{
bzero(buff,sizeof(buff));
printf("输入要发送的数据\n");
fgets(buff,sizeof(buff),stdin);
ret = send(sockfd,buff,sizeof(buff),0);
if(ret < 0)
{
perror("send");
return -3;
}
else
{
if(strcmp(buff,"quit")==0) break;
if(strcmp(buff,"quit\n")==0) break;
printf("send ok \n");
}
}
close(sockfd);
return 0;
}
运行结果