bind(sock, (struct sockaddr *)&addr, slen)
时间: 2024-03-04 13:51:27 浏览: 30
这段代码是将一个套接字(socket)与一个地址(address)绑定在一起。其中,sock是一个已经创建好的套接字,addr是一个指向地址结构体的指针,slen是地址结构体的大小。
具体来说,这个函数调用会将sock与addr所指向的地址结构体绑定在一起,使得sock可以使用该地址进行通信。这个地址可以是IP地址和端口号的组合,也可以是Unix域套接字(Unix domain socket)的路径。
在网络编程中,这个函数通常用于服务器端在启动时将自己的套接字与一个特定的IP地址和端口号关联在一起,从而可以接受客户端的连接请求。
相关问题
int ipc_open(const char *name) { int sock; struct sockaddr_un addr; socklen_t slen; assert(name); assert(strlen(name) < IPC_PATH_MAX); if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) return -1; addr.sun_family = AF_UNIX; addr.sun_path[0] = 0; strcpy(addr.sun_path + 1, name); slen = sizeof(addr.sun_family) + strlen(name) + 2; if (bind(sock, (struct sockaddr *)&addr, slen) < 0) { close(sock); return -1; } return sock; }
这段代码是用来创建一个本地域套接字,并绑定到指定的路径名上。函数接受一个字符串参数name,表示要绑定的路径名。函数返回一个整数类型的套接字描述符,如果创建或绑定失败,则返回-1。函数的实现步骤如下:
1. 使用socket函数创建一个本地域套接字,返回一个套接字描述符。如果创建失败,返回-1。
2. 初始化一个sockaddr_un类型的结构体addr,用于保存套接字地址信息。设置addr的sun_family成员为AF_UNIX,表示使用本地域套接字。将addr的sun_path[0]成员设置为0,表示使用抽象命名空间的套接字,之后的路径名将被当做字符串使用。将name参数拷贝到addr的sun_path+1成员中,表示绑定的路径名。
3. 计算套接字地址结构体的大小slen。
4. 使用bind函数将套接字描述符sock与本地域套接字地址结构体addr绑定。如果绑定失败,则关闭sock套接字描述符,返回-1。
5. 返回sock套接字描述符,表示创建和绑定成功。
#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;
}
```
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)