struct sockaddr {
unsigned short sa_family; /* 地址类型, AF_xxx */
char sa_data[14]; /* 14字节的协议地址 */
};
struct sockaddr_in {
unsigned short sin_family; /*地址类型*/
unsigned short int sin_port; /*端口号*/
struct in_addr sin_addr; /*IP地址*/
unsigned char sin_zero[8]; /*填充字节,一般赋值为0*/
};
struct in_addr {
unsigned long s_addr;
};
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(80); /*设置端口号80*/
sock.sin_addr.s_addr = inet_addr("222.186.13.56"); /*设置地址*/
memset(sock.sin_zero, 0, sizeof(sock.sin_zero));
memset (void *s, int c, size_t n);
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
int sock_fd;
sock_fd = socket (AF_INET, SOCK_STREAM, 0);
if (sock_fd < 0) {
perror("socket");
exit(1);
}
#include <sys/types.h> |
#include <sys/socket.h> |
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); |
sockfd 是一个由函数 socket 创建的套接字。如果该套接字的类型是 SOCK_STREAM,则 connect() 函数用于向服务器发送连接请求,服务器的 IP 地址和端口号由参数 serv_addr 指定。如果套接字的类型是 SOCK_DGRAM,则 connect() 函数并不建立真正的连接,它只是告诉内核与该套接字进行通信的目的地址(由第二个参数指定),只有该目的地址发来的数据才会被 socket 接收。对于 SOCK_DGRAM 类型的套接字,调用 connect() 函数的好处是不必每次发送和接收数据时指定目的地址。 |
通常一个面向连接的套接字(如 TCP 套接字)只能调用一次 connect() 函数。而对于无连接的套接字(如 UDP 套接字)则可以多次调用 connect() 函数以改变与目的地址的绑定。将参数中的 serv_addr 中的 sa_family 设置为 AF_UNSPEC 可以取消绑定。 |
addrlen 参数是 serv_addr 的长度。 |
函数执行成功时返回0,出错时返回 -1,错误代码存入 errno 中。 |
该函数的常见用法如下: |
struct sockaddr_in serv_addr; |
memset(&serv_addr, 0, sizeof(struct sockaddr_in)); |
serv_addr.sin_family = AF_INET; |
serv_addr.sin_port = htons(80); |
if (inet_aton("222.186.13.56", &serv_addr.sin_addr) < 0) { |
perror("inet_aton"); |
exit(1); |
} |
/*使用 sock_fd 套接字连接到由 serv_addr 指定的目的地址上,这里假定 sock_fd 已定义*/ |
if (connect(sock_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) < 0) { |
perror("connect"); |
exit(1); |
} |
inet_aton()函数将一个字符串转换成一个网络地址,并把该网络地址赋给第二个参数 |
htons() 是字节顺序转换函数。 |
<span style=\"color: rgb(0, 136, 0);\">#include <sys/types.h></span><br /> <span style=\"color: rgb(0, 136, 0);\">#include <sys/socket.h></span><br /> <br /> <span style=\"color: rgb(0, 187, 0); font-weight: bold;\">int</span> <span style=\"color: rgb(0, 0, 0);\">bind</span>(<span style=\"color: rgb(0, 187, 0); font-weight: bold;\">int</span> <span style=\"color: rgb(0, 0, 0);\">sockfd</span><span style=\"color: rgb(0, 0, 0);\">,</span> <span style=\"color: rgb(170, 34, 255); font-weight: bold;\">struct</span> <span style=\"color: rgb(0, 0, 0);\">sockaddr</span> <span style=\"color: rgb(102, 102, 102);\">*</span><span style=\"color: rgb(0, 0, 0);\">my_addr</span><span style=\"color: rgb(0, 0, 0);\">,</span> <span style=\"color: rgb(0, 0, 0);\">socklen_t</span> <span style=\"color: rgb(0, 0, 0);\">addrlen</span>);
<span style=\"color: rgb(170, 34, 255); font-weight: bold;\">struct</span> <span style=\"color: rgb(0, 0, 0);\">sockaddr_in</span> <span style=\"color: rgb(0, 0, 0);\">serv_addr</span><br /> <span style=\"color: rgb(0, 0, 0);\">memset</span>(<span style=\"color: rgb(102, 102, 102);\">&</span><span style=\"color: rgb(0, 0, 0);\">serv_addr</span><span style=\"color: rgb(0, 0, 0);\">,</span> <span style=\"color: rgb(102, 102, 102);\">0</span><span style=\"color: rgb(0, 0, 0);\">,</span> <span style=\"color: rgb(170, 34, 255); font-weight: bold;\">sizeof</span>(<span style=\"color: rgb(170, 34, 255); font-weight: bold;\">struct</span> <span style=\"color: rgb(0, 0, 0);\">sockaddr_in</span>));<br /> <span style=\"color: rgb(0, 0, 0);\">serv_adr</span><span style=\"color: rgb(0, 0, 0);\">.</span><span style=\"color: rgb(0, 0, 0);\">sin_family</span> <span style=\"color: rgb(102, 102, 102);\">=</span> <span style=\"color: rgb(0, 0, 0);\">AF_INET</span><br /> <span style=\"color: rgb(0, 0, 0);\">serv_addr</span><span style=\"color: rgb(0, 0, 0);\">.</span><span style=\"color: rgb(0, 0, 0);\">sin_port</span> <span style=\"color: rgb(102, 102, 102);\">=</span> <span style=\"color: rgb(0, 0, 0);\">htons</span>(<span style=\"color: rgb(102, 102, 102);\">80</span>);<br /> <span style=\"color: rgb(0, 0, 0);\">serv_addr</span><span style=\"color: rgb(0, 0, 0);\">.</span><span style=\"color: rgb(0, 0, 0);\">sin_addr</span><span style=\"color: rgb(0, 0, 0);\">.</span><span style=\"color: rgb(0, 0, 0);\">s_addr</span> <span style=\"color: rgb(102, 102, 102);\">=</span> <span style=\"color: rgb(0, 0, 0);\">htonl</span>(<span style=\"color: rgb(0, 0, 0);\">INADDR_ANY</span>);<br /> <br /> <span style=\"color: rgb(170, 34, 255); font-weight: bold;\">if</span> (<span style=\"color: rgb(0, 0, 0);\">bind</span>(<span style=\"color: rgb(0, 0, 0);\">sock_fd</span><span style=\"color: rgb(0, 0, 0);\">,</span> (<span style=\"color: rgb(170, 34, 255); font-weight: bold;\">struct</span> <span style=\"color: rgb(0, 0, 0);\">sockaddr</span> <span style=\"color: rgb(102, 102, 102);\">*</span>)<span style=\"color: rgb(102, 102, 102);\">&</span><span style=\"color: rgb(0, 0, 0);\">serv_addr</span><span style=\"color: rgb(0, 0, 0);\">,</span> <span style=\"color: rgb(170, 34, 255); font-weight: bold;\">sizeof</span>(<span style=\"color: rgb(170, 34, 255); font-weight: bold;\">struct</span> <span style=\"color: rgb(0, 0, 0);\">sockaddr_in</span>) <span style=\"color: rgb(102, 102, 102);\"><</span> <span style=\"color: rgb(102, 102, 102);\">0</span>) <span style=\"color: rgb(0, 0, 0);\">{</span><br /> <span style=\"color: rgb(0, 0, 0);\">perror</span>(<span style=\"color: rgb(187, 68, 68);\">"bind"</span>);<br /> <span style=\"color: rgb(0, 0, 0);\">exit</span>(<span style=\"color: rgb(102, 102, 102);\">1</span>);<br /> <span style=\"color: rgb(0, 0, 0);\">}</span>
#include <sys/socket.h>
int listen(int s, int backlog);
#define LISTEN_NUM 12 //定义连接请求队列长度
...
if (listen(sock_fd, LISTEN_NUM) < 0 {
perror("listen");
exit(1);
}
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
int client_fd;
int client_len;
struct sockaddr_in client_addr;
...
client_len = sizeof (struct sockaddr_in);
client_fd = accept (sock_fd, (struct sockaddr *)&client_addr, &client_len);
if (conn_fd < 0) {
perror("accept");
exit(1);
}
1、发送数据 |
#include <sys/types.h>
#include <sys/socket.h>
int send(int s, const void *msg, size_t len, int flags);
#define BUFFERSIZE 1500
char send_buf[BUFFERSIZE];
...
if (conn_fd, send_buf, len, 0) { // len 为待发送数据的长度
perror("send");
exit(1);
}
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |