bind函数要求的地址类型是((struct sockaddr *)&adr_inet意思)

本文目录
(struct sockaddr *)&adr_inet意思
1楼那位大哥你就不要误人子弟了。。。
这个显然是 socket编程中的。。。
首先&addr_inet 是取addr_inet的地址, 因为addr_inet的指针类型是sockaddr_in * 的 ,而 bind函数第二个参数需要 sockaddr * 的,所以只是一个指针类型转换罢了。
什么叫做地址只是个值不用转换啊。 那你float 也是个值,int 也是个值, 那为什么会有float 转换成int 型呢?
socket的bind函数是不是只能绑定本地IP,不能绑定外网IP么
不是这样的, 它绑定你给它的IP (不分内外网),如果你的程序在服务器端(服务器必须有一个固定的IP)运行,你的代码读取本机IP时 就是那个固定IP了
c++开启一个简单的http响应
#include《stdio.h》
#include《winsock2.h》
#pragma comment(lib,"ws2_32.lib)
#define HTTP_PORT 8080
#define HTTP_BUFFER_SIZE 2048
#define HTTP_FILENAME_LEN 256
struct doc_type//定义文件类型
{
char *suffix;
char *type;
};
struct doc_type file_type=
{
{"html", "text/html" },
{"gif", "image/gif" },
{"jpeg", "image/jpeg" },
{ NULL, NULL }
};
/**************************************************************************
*
* 函数功能: 根据文件后缀查找对应的 Content-Type.
*
* 参数说明: suffix, 文件名后缀;
*
* 返 回 值: 成功返回文件对应的 Content-Type, 失败返回 NULL.
*
**************************************************************************/
c
***隐藏网址***
{
struct doc_type *type;
for(type=file_type;type-》suffix;type++)
{
if(strcmp(type-》suffix,suffix)==0)
return type-》type;
}
return null;
}
/**************************************************************************
*
* 函数功能: 解析请求行, 得到文件名及其后缀. 请求行格式:
***隐藏网址***
*
* 参数说明: buf, 字符串指针数组;
* buflen, buf 的长度;
* file_name, 文件名;
* suffix, 文件名后缀;
*
* 返 回 值: void.
*
**************************************************************************/
void heet_parse_request_cmd(char *buffer,int buflen,char *filename,char *suffix)
{
int length=0;
char *begin,*end,*bias;
begin=strchr(buf,’ ’);
begin+=1;
end=strchr(begin,’ ‘);
*end=0;
bias=strrchr(begin,’/’);
length=end-bias;
if((*bias==’/’)||(*bias==’\\’))
{
bias++;
length--;
}
/* 得到文件名 */
if (length 》 0)
{
memcpy(file_name, bias, length);
file_name = 0;
begin = strchr(file_name, ’.’);
if (begin)
strcpy(suffix, begin + 1);
}
}
/**************************************************************************
*
* 函数功能: 向客户端发送 HTTP 响应.
*
* 参数说明: buf, 字符串指针数组;
* buf_len, buf 的长度;
*
* 返 回 值: 成功返回非0, 失败返回0.
*
**************************************************************************/
***隐藏网址***
{
int read_len,file_len,hdr_len,send_len;
char *type;
char read_buf;
***隐藏网址***
char file_name="html";
FILE *res_file;
/* 得到文件名和后缀 */
***隐藏网址***
res_file = fopen(file_name, "rb+"); /* 用二进制格式打开文件 */
if (res_file == NULL)
{
printf(" is not existed\n", file_name);
return 0;
}
/* 构造 HTTP 首部,并发送 */
***隐藏网址***
***隐藏网址***
if (send_len == SOCKET_ERROR)
{
fclose(res_file);
printf(" Fail to send, error = %d\n", WSAGetLastError());
return 0;
}
do /* 发送文件, HTTP 的消息体 */
{
read_len = fread(read_buf, sizeof(char), HTTP_BUF_SIZE, res_file);
if (read_len 》 0)
{
send_len = send(soc, read_buf, read_len, 0);
file_len -= read_len;
}
} while ((read_len 》 0) && (file_len 》 0));
fclose(res_file);
return 1;
}
Int main()
{
WSADATA wsa_data;
SOCKET srv_soc,acpt_soc;
struct sockaddr_in serv_addr;
struct sockaddr_in from_addr; /* 客户端地址 */
char recv_buf;
unsigned short port = HTTP_DEF_PORT;
unsigned long from_len = sizeof(from_addr);
int result = 0, recv_len;
if (argc == 2) /* 端口号 */
port = atoi(argv);
WSAStartup(MAKEWORD(2,0), &wsa_data); /* 初始化 WinSock 资源 */
srv_soc = socket(AF_INET, SOCK_STREAM, 0); /* 创建 socket */AF的意思是IP4 sock是使用sock流。0是不指定TCP还是udp。根据情况而定
if (srv_soc == INVALID_SOCKET)
{
printf(" socket() Fails, error = %d\n", WSAGetLastError());
return -1;
}
/* 服务器地址 */
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);TCP采用大端传输的方式。这个函数就是实现大端。高字节在低地址。
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
将主机数转换成无符号长整型的网络 字节顺序 。本函数将一个32位数从主机字节顺序转换成网络字节顺序。
result = bind(srv_soc, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
bind函数把一个本地的协议地址赋予一个套接字,对于网际协议。协议地址是32位de ip4或者128位的ip6与16位的tcp或者udp端口的组合。
if (result == SOCKET_ERROR) /* 绑定失败 */
{
closesocket(srv_soc);
printf(" Fail to bind, error = %d\n", WSAGetLastError());
return -1;
}
result = listen(srv_soc, SOMAXCONN);//SOMAXCONN限制系统中监听该端口的最大连接数。保存的是完成三次握手、等待accept的全连接,而不是半连接。
printf(" The server is running ... ...\n");
while (1)
{
acpt_soc = accept(srv_soc, (struct sockaddr *) &from_addr, &from_len);
if (acpt_soc == INVALID_SOCKET) /* 接受失败 */
{
printf(" Fail to accept, error = %d\n", WSAGetLastError());
break;
}
printf("\n",
inet_ntoa(from_addr.sin_addr), ntohs(from_addr.sin_port));
recv_len = recv(acpt_soc, recv_buf, HTTP_BUF_SIZE, 0);
if (recv_len == SOCKET_ERROR) /* 接收失败 */
{
closesocket(acpt_soc);
printf(" Fail to recv, error = %d\n", WSAGetLastError());
break;
}
recv_buf = 0;
/* 向客户端发送响应数据 */
***隐藏网址***
closesocket(acpt_soc);
}
closesocket(srv_soc);
WSACleanup();
printf(" The server is stopped.\n");
return 0;
}
***隐藏网址***

更多文章:
checked in(check in和check out的区别)
2026年9月7日 01:20
java经典上机编程题(java上机题 请问这道题应该怎么写)
2026年9月7日 01:10
影视剧中有哪些剧情颠覆了你的三观?金庸的武侠小说《白马啸西风》为什么没有被拍成电影或者电视剧
2026年9月7日 00:30
mysql varchar和char的区别(mysql中char、varchar、nvarchar区别)
2026年9月7日 00:10
linux命令的选项和参数(linux为什么要有参数和选项)
2026年9月6日 20:20
perseverance的意思(preseverance的意思)
2026年9月6日 18:30
react native和uniapp(h5和uniapp和react性能)
2026年9月6日 18:00
mysql查看有哪些表(在mysql里面怎么查看数据库里面有多少表)
2026年9月6日 17:40
parsefloat()(html里的parsefloat什嘛意思)
2026年9月6日 16:30


