以下是一个使用C语言编写的非阻塞式TCP连接客户端,并在连接成功后发送”hello”消息的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
int main() {
// 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("Failed to create socket");
exit(1);
}
// 设置socket为非阻塞模式
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
// 设置服务器地址和端口号
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 替换成你要连接的服务器端口号
if (inet_pton(AF_INET, "127.0.0.1", &(server_addr.sin_addr)) <= 0) {
perror("Invalid address/Address not supported");
exit(1);
}
// 连接服务器
int connect_result = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(connect_result == -1){
if(errno != EINPROGRESS){
perror("Failed to connect");
exit(1);
}
}
fd_set write_fds;
FD_ZERO(&write_fds);
FD_SET(sockfd,&write_fds);
struct timeval timeout;
timeout.tv_sec=5;
timeout.tv_usec=0;
int ret=select(sockfd+1,NULL,&write_fds,NULL,&timeout);
if(ret == -1){
perror("Failed to select");
exit(1);
}
else if(ret == 0){
perror("Connection timeout");
exit(1);
}
int connect_error;
socklen_t len = sizeof(connect_error);
// 检查连接状态
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &connect_error, &len) < 0) {
perror("Error in getsockopt");
exit(1);
}
if (connect_error != 0) {
fprintf(stderr, "Failed to connect: %s\n", strerror(connect_error));
exit(1);
}
printf("Connected successfully!\n");
// 发送消息
const char* message = "hello";
int send_result = send(sockfd, message, strlen(message), 0);
if (send_result == -1) {
perror("Failed to send message");
exit(1);
}
printf("Message sent: %s\n", message);
// 关闭socket
close(sockfd);
return 0;
}
请注意,在这个示例代码中,我们使用了非阻塞式的connect()函数,并通过select()函数来等待连接完成。如果超时时间内连接未完成,将会输出”Connection timeout”错误。一旦连接成功,就可以发送”hello”消息给服务器端。
请根据你的实际情况修改服务器地址和端口号,并确保在编译和运行代码之前已经启动了对应的服务器。
内容由零声教学AI助手提供,问题来源于学员提问