- 客户端编程源代码:
文中代码段的注释目前还不够完整,可能会有部分注释会有错误,现阶段要专心考研了,考完研再回来好好研究研究!考研加油!
#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;
}
}