欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

网络编程5:socket服务端和客户端代码实现

程序员文章站 2022-03-08 15:17:28
socket服务端和客户端代码实现客户端代码:#include #include #include //#include //与下一行冲突#include #include #include #include ...

socket服务器和客户端代码实现

服务器代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>//与下一行冲突
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
int main()
{
 
 //1.socket:获取套接字
 int s_fd;
 s_fd=socket(AF_INET,SOCK_STREAM,0);
 if(s_fd==-1)
 {
  perror("socket");
  exit(-1);
 }
 //2.bind:绑定IP地址和端口号
 struct sockaddr_in s_addr;//在头文件#include <linux/in.h>当中定义的结构体
 memset(&s_addr,0,sizeof(struct sockaddr_in));//清空
 s_addr.sin_family=AF_INET;//绑定ip地址
 s_addr.sin_port=htons(8988);//5000-9000为端口号,端口号需要转化为网络字节序
 //s_addr.sin_addr.s_addr=inet_aton("127.0.0.1");//IP地址结构体,并转化。错误格式
 inet_aton("172.20.10.3",&s_addr.sin_addr);//正确格式:对结构体取地址,再转换
 bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));
 //3.listen:监听是否有客户端到来
 listen(s_fd,10);//监听10个
 //4.accept:接受
 int clen = sizeof(struct sockaddr_in);
 struct sockaddr_in c_addr;
 memset(&c_addr,0,sizeof(struct sockaddr_in));//清空
 int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);//通过套接字接受客户端,句柄换用c_fd
 if(c_fd == -1)
 {
  perror("accept");
 }
 printf("get connext:%s\n",inet_ntoa(c_addr.sin_addr));
 //5/read:读取数据
 char readbuf[128];
 int n_read=read(c_fd,readbuf,128);
 if(n_read == -1)
 {
  perror("read");
 }else
 {
  printf("get message: %d,%s\n",n_read,readbuf);
 }
 //6.write:发送数据--- 回复
 char *msg="i get your connext";
 write(c_fd,msg,strlen(msg));
 
 return 0;
}

实现服务器代码之后,我们可以通过**windows平台或者Linux平台下的telnet客户端** 来测试服务器的地址端口是否导通

也可以通过客户端代码与服务器建立连接。

客户端代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>//与下一行冲突
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
int main()
{
 
 //1.socket:获取套接字
 int c_fd;
 c_fd=socket(AF_INET,SOCK_STREAM,0);
 if(c_fd==-1)
 {
  perror("socket");
  exit(-1);
 }
 struct sockaddr_in c_addr;
 memset(&c_addr,0,sizeof(struct sockaddr_in));
 c_addr.sin_family=AF_INET;
 c_addr.sin_port = htons(8988);
 inet_aton("172.20.10.3",&c_addr.sin_addr);
 //2.connext:连接服务器
 int cnt=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr));//在连接的过程会阻塞在这里
 if(cnt==-1)
 {
  perror("socket");
  exit(-1);
 }
 //3.write:客户端发送数据
 char *msg = "msg from client\n";
 write(c_fd,msg,strlen(msg));
 //4.read:读取数据
 char readbuf[128];
 int n_read=read(c_fd,readbuf,128);
 if(n_read == -1)
 {
  perror("read");
 }else
 {
  printf("get message from sever: %d,%s\n",n_read,readbuf);
 }
 return 0;
}

注1:在win10操作系统下有telnet客户端,但没有telnet服务器,需要下载,安装并打开
需要进一步解决
注2:在linux平台上,telnet出现连接超时的问题,也需要进一步解决。
注3:以上代码在连接的时候存在小bug,有待修正。

本文地址:https://blog.csdn.net/weixin_40734514/article/details/108569731