最近学习了关于LINUX环境下的网络编程,具体的函数就不一一详细介绍了,直接开始题目:
注意:本人只是习惯使用for循环,因为觉得简洁方便。
这里将使用C语言用TCP协议实现:服务器使用多线程为客户端提供服务,客户端发送任意一个正整数,服务器端返回此数因子的个数。
先从客户端开始,先引入相关头文件,宏定义一个端口号:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <string.h>
#define PORT 1234 //端口号
然后是主函数,声明网络编程所需要用到的相关变量:
int main(int argc,char *argv[])
{
int sock; //使用的套接字
struct sockaddr_in sock_addr; //socket使用的结构体变量
struct hostent *host; //主机地址解析获取到的ip存储结构体
接着是ip地址的解析,作为客户端只需要创建socket以及connect进行连接,为了操作方便和出错的情况采用for循环去执行对应函数。注意:因为程序执行时,出错默认是重来的,只有输入‘N’才会取消。具体看代码:
if(argc < 2)
{
printf("请在执行时带上连接的ip地址\n");
exit(0);
}
// 地址解析,传入主机域名
printf("地址为:%s\n",argv[1]);
if((host = gethostbyname(argv[1])) == NULL)
{
printf("地址解析错误\n");
exit(0);
}
// 设置sock_addr结构体成员
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(PORT);
sock_addr.sin_addr = *((struct in_addr *)host->h_addr); //赋值地址
// printf("sock_addr.sin_addr=%d\n",sock_addr.sin_addr);
bzero(&(sock_addr.sin_zero),8); //将该内存地址前八位清零
// 创建socket
for(;(sock = socket(AF_INET,SOCK_STREAM,0)) == -1;)
{
printf("创建socket错误\n");
printf("是否重新创建?Y/N\n");
char c = 0;
scanf("%c",&c);
if(c == 'N')
{
printf("已放弃创建\n");