Socket程序之客户端程序

本文介绍了一个简单的Socket客户端程序实现过程,包括如何建立连接、发送消息、接收消息等关键步骤,并展示了如何利用select函数进行输入输出多路复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
/*Socket可以说是网络编程中重要的一环
相对简单和易懂,以Socket的编程作为切入点相信有很大的益处
下面是我在学习网络编程的时候编写的Socket客户端程序*/
 
/****************************************************************
*
* This file is the property of MaiWei Cable TV Enquentment Ltd.co.
* The unauthorised use, copy and transfer of all or any part of
* this file is forbidden.
*
****************************************************************/
#include<sys/stat.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include"TCL_socket_fun.h"
#define PORT 5125
#define SERVER_IP "10.128.118.45"
int main()
{
    TCL_FD_SET rfds;
       TCL_INT32 s;
       TCL_SOCKADDR_IN addr;
       TCL_CHAR buffer[256];
       if((s = TCL_socket(AF_INET,SOCK_STREAM,0))<0)
 {
  perror("socket");
  exit(1);
 }
       bzero(&addr,sizeof(addr));
       addr.sin_family = TCL_AF_INET;
       addr.sin_port=TCL_htons(PORT);
       addr.sin_addr.is_ip_addrs = inet_addr(SERVER_IP);
 
/*
 TCL_INT32 TCL_connect(TCL_INT32 socketd, struct TCL_SOCKADDR_IN * serverAddr, TCL_INT16 len);
 
 说明: 客户程序调用connect函数来使客户socket socketd与监听于serverAddr所指定的计算机的特定端口上的服务Socket进行连接。
 返回: 0: 成功
 SOCKET_ERROR:失败。
 参数说明:
 socketd:socket ID;
 serverAddr:保存对端地址及端口号的结构指针;
 len:地址长度,目前保留不使用;
 使用说明:默认为阻塞,可以通过fcntl()设置为非阻塞
*/ 
 
       if(TCL_connect(s,&addr,sizeof(addr))<0)
 {
  perror("connect");
  exit(1);
 }
 
       while(TCL_TRUE)
 {
 
  TCL_fd_zero(&rfds);//每次循环都要清空集合,否则不能检测描述符变化
  TCL_fd_set(s,&rfds);//添加描述符
  TCL_fd_set(STDIN_FILENO,&rfds);//添加描述符
 
/*
  select() 输入输出多路复用
  
  TCL_INT32 TCL_socket_select(TCL_INT32 socketnum_max, TCL_FD_SET * fd1, TCL_FD_SET * fd2, TCL_FD_SET * fd3, TCL_UINT32 num);
 
  说明:确定一个或多个socket的状态,如需要则等待,
  返回:成功返回0 ,失败返回SOCKET_ERROR
 
  参数说明:
  socket:需要确定状态的最大socket数目;
  fd1: (可选)指针,指向一组等待可读性检查的socket;
  fd2: (可选)指针,指向一组等待可写性检查的socket;
  fd3: (可选)指针,指向一组等待错误检查的socket;
  num:select()最多等待时间,单位为毫秒;0表示不等待,-1表示阻塞操作。
  使用说明:。
 */
       switch(TCL_socket_select(s+1,&rfds,NULL,NULL,NULL))
  {
   case TCL_FAILURE: //#define TCL_FAILURE (-1) 发生错误时返回 -1
               exit(TCL_FAILURE);
          break;
 
   case   TCL_FALSE://#define TCL_FALSE (0)  表示描述词状态改变前已超过 timeout 时间
            break; //再次轮询
     default :
                            
       /*
 
       TCL_INT32 TCL_fd_isset(TCL_INT32 socket, TCL_FD_SET *fd);
       说明:查询某socket是否在指定的队列中
       返回:
       0:不在
       1:在
       参数说明:
       Socket: 指定的socket
       fd: 指定socket队列
 
       */
        if(TCL_fd_isset(STDIN_FILENO,&rfds))
                       {
         bzero(buffer,sizeof(buffer));//清空buffer
         /*
         read() 将参数STDIN_FILENO所指向的文件传送sizeof(buffer)个字节到buffer
 
         STDIN_FILENO 是标准输入的文件描述符
         详见/usr/include/unistd.h
 
         代码:
          Standard file descriptors
 
         #define STDIN_FILENO    0        Standard input. 
         #define STDOUT_FILENO   1        Standard output. 
         #define STDERR_FILENO   2       Standard error output. 
         */
         read(STDIN_FILENO,buffer,sizeof(buffer));
         
         if(strcmp(buffer,"exit/n") == 0)
         {
          close(s);
          break;
         }
 
         if(TCL_socket_send(s,buffer,sizeof(buffer),0)<0)
         {
          perror("send error");
          exit(1);
         }
            }
       if(TCL_fd_isset(s,&rfds))
       {
        bzero(buffer,sizeof(buffer));
        TCL_socket_recv(s,buffer,sizeof(buffer),0);
        printf("%s/n",buffer);
       }
  }//end switch
         }//end while
       close(s);
  return TCL_SUCCESS;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值