Socket编程-③tcp代码实例+解析

◎解析代码◎
在这里插入图片描述

Socket_demo _tcp

实验路径**~/Socket_exp/Socket_demo$ 实验环境 - Linux

ser.c - 建立socket服务器

//头文件:stdio.hstdlib.hstring.hunistd.hsys/types.hsys/socket.hnetinet/in.h arpa/inet.herrno.h
//定义端口号:PORT - ( 0 - 65535 ) - 1024以下端口号保留预定义服务

1.创建Socket

int socket_fd = socket( AF_INET , SOCK_STREAM , 0 )
if( socket_fd == -1 )
{
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
//OR  perror("socket failed");
exit(-1);  
}

2.准备通信地址

struct sockaddr_in seraddr;  //创建结构体
memset( &seraddr , 0 , sizeof(seraddr) );  //初始化结构体
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置INADDR_ANY,自动获取本机IP
//OR inet_aton("192.168.182.10", &seraddr.sin_addr);    //手动设置IP地址
seraddr.sin_port = htons( PORT ); //设置端口为 PORT

3.Socket addr 绑定

int bind_res = bind( socket_fd ,  (struct sockaddr *)&seraddr , sizeof(seraddr) );
if( bind_res == -1 )
{
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);  
//OR perror("bind failed");
exit(-1);
}

4.监听端口

int listen_res = listen( socket_fd , 10 );
if( listen_res == -1 )
{
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);  
//OR perror("listen failed");
exit(-1);
}
printf("======waiting for client's request======\n");  

5.处理接受客户端的连接请求

int connect_fd ;
struct sockaddr_in fromaddr;
memset( &fromaddr, 0 , sizeof(fromaddr) );  //初始化结构体
socklen_t len = sizeof(fromaddr);
begin:connect_fd = accept( socket_fd , (struct sockaddr*)fromaddr , &len );
if( connect_fd == -1 )
{
perror("accept failed");
continue;                           //阻塞直到有客户端连接,节省CPU资源
}
while(true)
{
//6.处理客户端数据
}

6.处理客户端数据

while(true)
{
//6.处理客户端数据
char buf[4096] = {0};
char *str = "Hello,you are connected!\n";
int count = recv( connect_fd , buf , sizeof(buf) , 0 );
if( !fork() )
{
if(send(connect_fd, str , strlen(str) ,0) == -1) perror("send error");  
close(connect_fd);  
 exit(0);  
}
if(count == 0 ){printf("The client is dead\n");goto begin;}
printf("有一个客户端连接到服务器,它是:%s\n", inet_ntoa(fromaddr.sin_addr));
buf[count] = '\0';
printf("从客户端读取到%d字节:%s\n",count, buf);
}
close(connect_fd);  
close(socket_fd);
return 0;

cli.c - 建立socket客户端

//头文件:stdio.hstdlib.hstring.hunistd.hsys/types.hsys/socket.hnetinet/in.h arpa/inet.herrno.h
//定义端口号:PORT - ( 0 - 65535 ) - 1024以下端口号保留预定义服务
// - int main( int argc , char** argv ) 带参执行main

int i_port = 8000;   //默认8000端口
char *c_ipAddr =127.0.0.1;
if( argc == 1)
{
    printf("This client will connect server message: IP=127.0.0.1 , Port=8000 \n");        
}
else if( argc ==2 )
{
    c_ipAddr = argv[1];
    printf("This client will connect server message: IP=%s , Port=8000 \n",c_ipAddr);    
 }
else if( argc == 3)
{
    c_ipAddr = argv[1];
i_port = atoi(argv[2]);
printf("This client will connect server message: IP=%s,Port=%d \n",c_ipAddr, i_port);    
}
else
{  
     printf("usage: ./client <ipaddress> and port \n");  
     exit(-1);

1.创建Socket

·同服务器端

2.准备通信地址

struct sockaddr_in seraddr;  //创建结构体
memset( &seraddr , 0 , sizeof(seraddr) );  //初始化结构体
seraddr.sin_family = AF_INET;
/*设置为服务器进程的端口号*/
seraddr.sin_port = htons(i_port);  //设置端口为 PORT
/*服务器所在主机IP地址*/
 if( inet_pton(AF_INET, c_ipAddr, &seraddr.sin_addr) <= 0){  
    printf("inet_pton error for %s\n",argv[1]);  
    exit(-1);  
    }  

3.连接服务器

if( connect(socket_fd, (struct sockaddr*)&seraddr, sizeof(seraddr)) < 0){  
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(-1);  
}
printf("连接服务器成功....\n");

4.和服务器交换数据 - Then Close

printf("send msg to server: \n");  
char    recvline[4096], sendline[4096] , buf[4096];
int rec_len;
    fgets(sendline, 4096, stdin);  
    if( send(socket_fd, sendline, strlen(sendline), 0) < 0)  
    {  
     printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
     exit(-1);  
    }  
    if((rec_len = recv(socket_fd, buf, 4096,0)) == -1) {  
       perror("recv error");  
       exit(-1);  
    }  
    buf[rec_len]  = '\0';  
    printf("Received : %s ",buf);  
    close(socket_fd);  
exit(0);  

OR 4.和服务器交换数据 - Then Close

char buf[100] = {0};
char *str = "hello...";
write(sockfd, str, strlen(str)) ;
read(sockfd, buf, sizeof(buf));
printf("服务器说:%s\n", buf);
close(sockfd);
return 0;

实例编写: Linux服务器Windows客户端通信基于TCP
附件:Linux_ser.c VS2015_cli.cpp

链接: https://download.csdn.net/download/qq_42819325/89139589

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值