ret = connect(sockfd, (struct sockaddr*)&address, sizeof(address)); if (ret == 0) { // 如果连接成功,则恢复sockfd的属性,并立即返回 printf("connfd with server immediately\n"); fcntl(sockfd, F_SETFL, fdopt); return sockfd; }
时间: 2024-03-31 08:31:55 浏览: 112
这是一个基于 socket 编程的连接服务器的代码片段。首先,使用 connect 函数尝试连接服务器,如果连接成功,则恢复 sockfd 的属性,设置为非阻塞模式,并立即返回 sockfd。
其中,sockfd 是一个套接字描述符,通过 socket 函数创建。address 是一个 sockaddr_in 结构体类型的指针,包含了服务器的 IP 地址和端口号。ret 是 connect 函数的返回值,如果返回值为 0,则说明连接成功。
fcntl 函数是用来设置 sockfd 的属性,在这里将 sockfd 设置为非阻塞模式。F_SETFL 是一个命令宏,用来设置文件描述符状态标志。fdopt 是一个变量,保存 sockfd 的状态标志。
这段代码的作用是连接服务器,并设置 sockfd 的属性。由于 sockfd 是非阻塞模式,因此此函数的调用不会阻塞当前进程,可以立即返回 sockfd,以便后续的操作。
相关问题
int UDPSocket(unsigned short port) { int ret = -1; /********** BEGIN **********/ /********** END **********/ return ret; }
这是一个用于创建UDP套接字的函数,函数名为UDPSocket,参数为一个无符号短整型的端口号port,返回值为一个整型的套接字描述符。
在函数体内,需要调用系统函数socket()来创建UDP套接字,并将其绑定到指定的端口号上。具体步骤如下:
1. 调用socket()函数创建一个UDP套接字,该函数会返回一个整型的套接字描述符,如果创建失败则返回-1;
2. 调用bind()函数将套接字与指定的端口号进行绑定,其中第一个参数为套接字描述符,第二个参数为sockaddr_in结构体类型的指针,该结构体中包含了本地IP地址和端口号等信息,如果绑定失败则返回-1。
完整的代码实现如下:
```
int UDPSocket(unsigned short port)
{
int ret = -1;
// 创建UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("create socket failed");
return ret;
}
// 绑定端口号
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind socket failed");
close(sockfd);
return ret;
}
return sockfd;
}
```
#include <sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<string.h> #include<netinet/in.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h> #define PORT 6000; #define SERVER_IP "192.168.40.128" void *routine(void * arg) { int newsockfd=(int *)&arg; char buf[10]; while(1) { bzero(buf,10); int size=recv(newsockfd,buf,sizeof(buf),0); buf[size]='\0'; printf("recive from client is : %s",buf); } } int main() { char buf[10]="hello"; int sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) { perror("socket fail\n"); return -1; } //Set Sockopt int sinsize = 1; int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sinsize, sizeof(int)); if(ret != 0) { perror("Set sockopt fail!\n"); exit -1; } struct sockaddr_in s; memset(&s,0,sizeof(s)); s.sin_family=AF_INET; s.sin_port=htons(6000); s.sin_addr.s_addr=inet_addr("192.168.40.128");// 要 求 大 端模式的端口号和 IP 地址 int bi=bind(sockfd,(struct sockaddr *)&s,sizeof(struct sockaddr)); if(bi<0) { perror("bind fail\n"); } listen(sockfd,5); struct sockaddr_in c; int size=sizeof(struct sockaddr); int newsockfd=accept(sockfd,(struct sockaddr *)&c,&size); /********************************** 创 建 线 程 ********************************************/ pthread_t pid; pthread_create(&pid,NULL,routine,(void *)socket); while(1) { memset(buf,0,10); fgets(buf,10,stdin); int slen=send(newsockfd,buf,strlen(buf),0); if(slen<0) { printf("send failed\n"); return -1; } } pthread_join(pid,NULL); close(newsockfd); close(sockfd); return 0; }
这段代码存在一些错误。首先,在 `#define PORT 6000;` 中应该去掉分号,否则会导致端口号变成 6001。其次,在 `exit -1;` 中应该使用括号,即 `exit(-1);`。最后,在创建线程时,应该将 `socket` 改成 `newsockfd`,即 `pthread_create(&pid,NULL,routine,(void *)newsockfd);`。修改后的代码如下:
```c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#define PORT 6000
#define SERVER_IP "192.168.40.128"
void *routine(void *arg)
{
int newsockfd = *(int *)arg;
char buf[10];
while(1)
{
bzero(buf, 10);
int size = recv(newsockfd, buf, sizeof(buf), 0);
buf[size] = '\0';
printf("recive from client is : %s", buf);
}
}
int main()
{
char buf[10] = "hello";
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket fail\n");
return -1;
}
// Set Sockopt
int sinsize = 1;
int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sinsize, sizeof(int));
if(ret != 0)
{
perror("Set sockopt fail!\n");
exit(-1);
}
struct sockaddr_in s;
memset(&s, 0, sizeof(s));
s.sin_family = AF_INET;
s.sin_port = htons(PORT);
s.sin_addr.s_addr = inet_addr(SERVER_IP);
int bi = bind(sockfd, (struct sockaddr *)&s, sizeof(struct sockaddr));
if(bi < 0)
{
perror("bind fail\n");
return -1;
}
listen(sockfd, 5);
struct sockaddr_in c;
int size = sizeof(struct sockaddr);
int newsockfd = accept(sockfd, (struct sockaddr *)&c, &size);
/********************************** 创建线程 ********************************************/
pthread_t pid;
pthread_create(&pid, NULL, routine, (void *)&newsockfd);
while(1)
{
memset(buf, 0, 10);
fgets(buf, 10, stdin);
int slen = send(newsockfd, buf, strlen(buf), 0);
if(slen < 0)
{
printf("send failed\n");
return -1;
}
}
pthread_join(pid, NULL);
close(newsockfd);
close(sockfd);
return 0;
}
```
阅读全文