soceket网络编程学习笔记之客户端编程

  • 客户端编程源代码:

文中代码段的注释目前还不够完整,可能会有部分注释会有错误,现阶段要专心考研了,考完研再回来好好研究研究!考研加油!

#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define MSG_STR     "Hello ! I'm client !"	//客户端向服务器发送的消息
#define SERVER_IP   "127.0.0.1" 			//服务器的IP地址,这里是本机地址。若服务器程序和客户端程序不在同一局域网内,可以改成公网IP
#define SERVER_PORT     8888 				//服务器地址端口号
int main(int argc , char **argv)
{
    int             sockfd = -1 ;			//定义socket文件描述符初始值为-1,-1表示错误
    int             rv = -1 ;				//定义返回值为-1
    struct  sockaddr_in serv_addr;			//将服务器地址定义为sockaddr_in结构体类型,sockaddr_in是系统封装好的服务器地址函数
    char            buf[1024];				//定义一个1024大小的空字符串数组
	
    while(1)
    {
		sockfd = socket(AF_INET , SOCK_STREAM , 0);		//调用socket函数开启TCP/IP通信,AF_INET,SOCK_STREAM 两个参数是固定的网络通信类型参数
		if(sockfd < 0 )									//若socket函数返回值小于0,表示连接服务器发生错误
		{
			printf("creat socket failure : %s\n", strerror(errno));
			goto NEXT_LOOP;								//直接退出连接
		}

		serv_addr.sin_family = AF_INET ;				//设置与服务器通信的协议族为AF_INET类型
		serv_addr.sin_port = htons(SERVER_PORT);		//设置与服务器通信地址的端口号
		inet_aton( SERVER_IP , &serv_addr.sin_addr );	//调用inet_aton()函数,aton顾名思义就是IP地址和服务器地址的ASIC码转化为net网络地址

		if( connect(sockfd , (struct sockaddr*)&serv_addr ,sizeof(serv_addr)) < 0 ) //调用connect()函数与服务器建立连接
		{
			printf("connect to serve [%s:%d] failure : %s\n", SERVER_IP , SERVER_PORT , strerror(errno));	//若连接失败则打印输出错误类型
			goto NEXT_LOOP;
		}


    if( write(sockfd , MSG_STR , strlen(MSG_STR)) < 0 )  //调用write()函数向服务器发送数据,MSG_STR是事先宏定义好的字符串
    {                                                                                                                           
        printf("write data to server [%s:%d] failure : %s\n", SERVER_IP , SERVER_PORT , strerror(errno));     
        goto NEXT_LOOP;                                                                                                         
    }                                                                                                                           

    memset(buf, 0 , sizeof(buf));  	  					//调用memset()函数初始化数组buf 
    rv = read(sockfd , buf , sizeof(buf));              //向服务器发送命令接收来自服务器的数据
    if( rv < 0 )            							//如果返回值小于0,表示接收失败,程序发生错误
    {                                                                                                                           
        printf("read data from server failure : %s\n", strerror(errno));   //如果接收失败则打印错误    
        goto NEXT_LOOP;                                                                                                         
        }   

    else if( rv == 0)       					//如果返回值为0,表示服务器与客户端终止连接
    { 
        printf("client connect to server disconnected\n");    
        goto NEXT_LOOP ;                   
    }                                

    printf("Read %d data bytes data from server : '%s'\n", rv , buf);  

NEXT_LOOP:      								//关闭文件描述符函数
    close(sockfd);                                                                                                              
    sleep(1);                                                                                                                   
    continue;                                                                                                                   
    }                                                                                                                           
 
}

猜你喜欢

转载自blog.csdn.net/weixin_42289213/article/details/88379711