下面的程序全都在linux下运行,windows系统不可以,可以开个linux虚拟机作为客户端
先上代码:
服务器端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define MAXLINE 4096
int main()
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[4096];
int n;
//创建一个TCP的socket
if( (listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
printf(" create socket error: %s (errno :%d)\n",strerror(errno),errno);
return 0;
}
//先把地址清空,检测任意IP
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6666);//端口号
//地址绑定到listenfd
if ( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {
printf(" bind socket error: %s (errno :%d)\n",strerror(errno),errno);
return 0;
}
//监听listenfd
if( listen(listenfd,10) == -1) {
printf(" listen socket error: %s (errno :%d)\n",strerror(errno),errno);
return 0;
}
printf("====waiting for client's request=======\n");
//accept 和recv,注意接收字符串添加结束符'\0'
while(1)
{
if( (connfd = accept(listenfd, (struct sockaddr *)NULL, NULL)) == -1) {
printf(" accpt socket error: %s (errno :%d)\n",strerror(errno),errno);
return 0;
}
n = recv(connfd,buff,MAXLINE,0);
buff[n] = '\0';
printf("recv msg from client:%s\n",buff);
close(connfd);
}
close(listenfd);
return 0;
}
客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXLINE 4096
int main(int argc, char**argv)
{
int sockfd,n;
char recvline[4096],sendline[4096];
struct sockaddr_in servaddr;
if(argc !=2)
{
printf("usage: ./client <ipaddress>\n");
return 0;
}
//创建socket
if( (sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
printf(" create socket error: %s (errno :%d)\n",strerror(errno),errno);
return 0;
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(6666);
//IP地址从“点分十进制”转换到“二进制整肃”
if( inet_pton(AF_INET,argv[1], &servaddr.sin_addr) <=0 ) {
printf("inet_pton error for %s\n",argv[1]);
return 0;
}
//连接
if( connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) <0) {
printf(" connect socket error: %s(errno :%d)\n",strerror(errno),errno);
return 0;
}
printf("send msg to server:\n");
fgets(sendline,4096,stdin);
//send发送
if ( send(sockfd,sendline,strlen(sendline),0) <0) {
printf("send msg error: %s(errno :%d)\n",strerror(errno),errno);
return 0;
}
close(sockfd);
return 0;
}
如何使用:
服务器端:
- 找到servaddr.sin_port变量修改端口号,选择的端口一定要是开启的
- 编译文件并运行
客户端:
- 找到servaddr.sin_port变量修改端口号,选择的端口要和服务器监听的端口一致。
- 编译文件
- 按此格式执行文件(客户端程序可执行文件+IP地址):./Client ipaddress
参考链接:https://blog.csdn.net/u013457167/article/details/79582924