int val = ::connect(mSocket,(SOCKADDR*)&addr,sizeof(addr));
时间: 2024-04-05 13:29:37 浏览: 13
这段代码的作用是使用解析出的 IP 地址和端口号向远程主机建立 TCP 连接,并返回连接结果。
具体来说,这段代码使用了 connect 函数向指定的服务器地址建立 TCP 连接。其中,mSocket 表示一个已经创建好的套接字,addr 表示前面初始化好的地址结构体,sizeof(addr) 表示地址结构体的大小。
函数执行后,会返回一个整数值,表示连接的结果。如果返回值为0,则表示连接成功;如果返回值为SOCKET_ERROR(一般为-1),则表示连接失败。在函数中,使用了 ::connect 表示调用的是全局作用域下的 connect 函数,而不是可能存在的同名函数。
相关问题
mSocket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); if(mSocket == INVALID_SOCKET){ ui->label->setText(QString("连接失败!!!")); ui->label->setStyleSheet("color:red;"); return; } mAddrStr = ui->lineEdit->text(); char ip[1024] = {0}; int port = 0; sscanf(mAddrStr.toUtf8().data(),"%[^:]:%d",ip,&port); qDebug() << ip; qDebug() << port; SOCKADDR_IN addr; addr.sin_family = PF_INET; addr.sin_port = htons((u_short)port); addr.sin_addr.S_un.S_addr = inet_addr(ip);//点分十进制转ip地址 int val = ::connect(mSocket,(SOCKADDR*)&addr,sizeof(addr)); int error; if( val == SOCKET_ERROR){ ui->label->setText(QString("连接失败!!!")); ui->label->setStyleSheet("color:red;"); error = WSAGetLastError(); qDebug() << "connect error:" << error; return; } ui->label->setText(QString("连接成功")); ui->label->setStyleSheet("color:orange;"); //创建处理和服务端通信的线程 mMsgThread = new MsgThread(mSocket); mMsgThread->start(); //信号槽连接 connect(this,&client::isSend,mMsgThread,&MsgThread::dealSend); connect(mMsgThread,&MsgThread::isMsg,this,&client::dealMsg); connect(mMsgThread,&MsgThread::isClose,this,&client::dealClose); }
这段代码是客户端连接服务器的核心部分,具体操作如下:
1. 调用socket函数创建一个套接字对象mSocket,用于与服务器进行通信;
2. 检查mSocket是否创建成功,如果失败,则更新UI界面为连接失败,并返回;
3. 从UI界面获取服务器地址和端口号,并将其解析为IP地址和端口号;
4. 填写SOCKADDR_IN结构体,用于指定服务器的地址和端口号;
5. 调用connect函数连接到服务器,如果连接失败,则更新UI界面为连接失败,并返回;
6. 如果连接成功,则更新UI界面为连接成功;
7. 创建一个MsgThread对象mMsgThread,并启动该线程;
8. 将三个信号与槽连接起来,用于处理客户端和服务器之间的消息传递。
总体来说,这段代码的作用是初始化一个客户端并连接到服务器,使得客户端可以与服务器进行通信。
windows环境下#include <stdio.h> #include <stdlib.h> #include <string.h> #include<windows.h> #include <WinSock2.h> #define PORT 8888 int main(int argc, char const *argv[]) { int sock = 0, valread; struct sockaddr_in serv_addr; char buffer[1024] = {0}; char filename[100] = {0}; FILE *fp; // 创建 socket 文件描述符 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } // 初始化地址结构体 memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将 IP 地址从字符串转换为二进制格式 if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("\n Invalid address/ Address not supported \n"); return -1; } // 连接服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\n Connection Failed \n"); return -1; } // 发送文件名 printf("Enter filename: "); scanf("%s", filename); send(sock, filename, strlen(filename), 0); // 打开文件 fp = fopen(filename, "rb"); if (fp == NULL) { perror("fopen failed"); exit(EXIT_FAILURE); } // 发送文件内容 while (!feof(fp)) { valread = fread(buffer, sizeof(char), sizeof(buffer), fp); send(sock, buffer, valread, 0); memset(buffer, 0, sizeof(buffer)); } // 关闭文件和 socket fclose(fp); close(sock); return 0;}该怎么写
这是一个基于 Socket 实现文件传输的客户端程序,需要连接到一个运行在本地的服务器。以下是完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#define PORT 8888
int main(int argc, char const *argv[])
{
WSADATA wsa;
SOCKET sock = INVALID_SOCKET;
struct sockaddr_in serv_addr;
char buffer[1024] = {0};
char filename[100] = {0};
FILE *fp;
int valread;
// 初始化 Winsock 库
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("WSAStartup failed. Error Code : %d\n", WSAGetLastError());
return -1;
}
// 创建 socket 文件描述符
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("Socket creation error. Error Code : %d\n", WSAGetLastError());
return -1;
}
// 初始化地址结构体
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 将 IP 地址从字符串转换为二进制格式
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
{
printf("Invalid address/ Address not supported.\n");
return -1;
}
// 连接服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("Connection failed.\n");
return -1;
}
// 发送文件名
printf("Enter filename: ");
scanf("%s", filename);
send(sock, filename, strlen(filename), 0);
// 打开文件
fp = fopen(filename, "rb");
if (fp == NULL)
{
perror("fopen failed");
exit(EXIT_FAILURE);
}
// 发送文件内容
while (!feof(fp))
{
valread = fread(buffer, sizeof(char), sizeof(buffer), fp);
send(sock, buffer, valread, 0);
memset(buffer, 0, sizeof(buffer));
}
// 关闭文件和 socket
fclose(fp);
closesocket(sock);
// 清理 Winsock 库
WSACleanup();
return 0;
}
```
需要注意的是,在 Windows 环境下使用 Socket 编程需要先调用 `WSAStartup()` 函数来初始化 Winsock 库,并在程序结束时调用 `WSACleanup()` 函数来清理 Winsock 库。此外,Windows 下使用的是 `closesocket()` 函数来关闭 socket,而不是 `close()` 函数。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)