Ⅰ Linux C语言网络编程问题!
unsigned int dir(char * server) {
int sck;//套接字变量
struct sockaddr_in serv_adr; //远程主机的地址
struct hostent *host; //指向远程主机的指针
unsigned char databuf[FILEBUF_SIZE]; //数据
int bytes = 0, bytesread = 0; //字节数,读取到的字节数
host = gethostbyname(server); //根据远程主机的主机名,得到指向远程主机的指针
if (host == (struct hostent *) NULL) { //如果得到指向远程主机的指针失败,报告错误,并返回
perror("gethostbyname failed");
return 0;
}memset(&serv_adr, 0, sizeof(serv_adr)); //初始化远程主机的地址,结构体内所有成员清零
serv_adr.sin_family = AF_INET; //设置地址类型
memcpy(&serv_adr.sin_addr, host->h_addr, host->h_length);//取出指向远程主机的指针中包含的地址信息,赋给远程主机地址变量
serv_adr.sin_port = htons(SERVICE_PORT);//设置端口号,比如http服务对应80端口,ftp对应21端口
if ((sck = socket(AF_INET, SOCK_STREAM, 0)) < 0) { //如果建立TCP协议的套接字失败,报告错误,并返回
perror("error on socket()");
return 0;
}
if (connect(sck, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) < 0) {//如果使用该套接字连接到远程主机失败,报告错误,并返回
perror("error on connect()");
return 0;
}write(sck, "DI\n\n", 4); //连接成功,发送内容为"DI\n\n"的消息,远程主机收到该消息,解析后生成目录列表,并将目录列表信息传递回来
printf("Remote directory listing:\n");//输出提示信息“远程主机正在生成目录列表”
while ((bytes = read(sck, databuf, FILEBUF_SIZE)) > 0) { //从套接字的数据流中读取远程主机的返回信息(即目录列表),每次读取FILEBUF_SIZE个字节,直到全部读取完毕
write(fileno(stdout), databuf, bytes);//将每次读到的数据,输出到标准输出流(stdout),即屏幕上
bytesread += bytes;//接收到的字节数累加
}
close(sck); /* Close the socket */ //通信完成,关闭套接字,关闭连接
return bytesread; //返回读取到的字节数(即远程主机返回的信息的大小)
}
Ⅱ C语言怎么实现TCP连接
TCP协议是一种面向连接、可靠的、基于字节流的传输层通信协议,其定义出自于IETF的RFC 793。在简化版的计算机网络OSI模型中,它承担了第四层传输层的任务。TCP协议的关键特性包括三次握手过程,这一过程确保了连接的建立和断开的可靠性。
三次握手的过程可以简单地理解为客户端向服务器发送一个连接请求,然后服务器回应确认信息,最后客户端再次确认。这一过程确保了连接的建立和断开的可靠性。基于字节流的特点意味着数据在传输过程中会被分割成多个字节进行传输,而接收端会将这些字节重新组合成完整的数据流。
理解TCP协议的关键特性,是实现C语言中的TCP连接的基础。在C语言中,实现TCP连接通常需要使用标准库中的套接字功能。具体而言,通过创建套接字、绑定IP地址和端口号、监听连接请求等步骤,可以实现与服务器的TCP连接。
在创建套接字时,需要调用socket()函数,该函数会创建一个套接字,然后需要使用bind()函数将该套接字绑定到特定的IP地址和端口号。接下来,通过listen()函数使套接字进入监听状态,等待客户端的连接请求。当客户端发起连接请求时,服务器会通过accept()函数接收连接请求,从而建立TCP连接。
在客户端方面,首先需要调用socket()函数创建套接字,然后使用connect()函数连接到服务器的特定地址和端口号。一旦连接成功,客户端和服务器之间的TCP连接就建立起来了,双方可以通过send()和recv()等函数进行数据传输。
实现TCP连接的过程涉及多个步骤和函数调用,理解这些基本概念和操作能够帮助开发者更好地掌握C语言中TCP连接的实现方法。
Ⅲ 在windows下用C语言如何实现socket网络编程,需要用到哪些头文件或者库
需要用到的头文件包含:
#include <winsock2.h>
#include <windows.h>
与Linux环境下socket编程相比,windows环境多了一个步骤:启动或者初始化winsock库
Winsock,一种标准API,一种网络编程接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本:
Winsock 1:
Windows CE平台支持。
头文件:WinSock.h
库:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数;
头文件:WinSock2.h
库:ws2_32.lib
mswsock.h用于编程扩展,使用时必须链接mswsock.dll
(3)c语言网络连接扩展阅读
winsock库的加载与卸载:
加载:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
加载成功,返回值为0。
WORD wVersionRequested:加载的winsock版本,使用宏MAKEWORD(x, y),x表示高字节,y表示低字节。然而使用时MAKEWORD(2, 2)。高字节与低字节相同~~
LPWSADATA lpWSAData:WSADATA结构的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。
卸载:int WSACleanup(void);比起加载,卸载的函数真是轻松愉快。