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

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,有待修正。

猜你喜欢

转载自blog.csdn.net/weixin_40734514/article/details/108569731