很难找到关于这四种方法实际做什么的简单解释,针对网络编程新手.人们通常只是声明他们认为在特定场景中关闭套接字的正确方法,而不是在每个步骤背后的背景中发生的事情.
通过示教一个人对鱼的理念去,你能解释的Shutdown,Disconnect,Close和Dispose方法呢?
任何人都知道delphi中的一种方式获得本地ip地址的简单列表(例如tstrings).
我已经看过另一个相关的问题了,似乎无法将它们转换为delphi.
我的项目使用的是使用winsock.h的windows.h,我需要包含使用winsock2的boost:assio.所以我收到很多错误,说Winsock.h已经包含在内了.我可以定义WIN32_LEAN_AND_MEAN.所以windows.h不会使用winsock.问题是,我需要windows.h来使用它,我只需要Asio用于异步定时器.我不需要winsock2.h.我试着搜索如何禁用其winsock2使用,我发现我可以通过在包含boost:asio之前定义BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN来做到这一点,但我仍然得到相同的错误.
#include <windows.h>
#define BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN
#include <boost/asio.hpp>
Run Code Online (Sandbox Code Playgroud)
错误
1> c:\ program files\boost\boost_1_47\boost\asio\detail\socket_types.hpp(22):致命错误C1189:#error:WinSock.h已包含在内
我刚刚通过"Beej的网络编程指南"一书开始学习winsock.我正在windows下编程并通过gcc运行它.这只是编写我的第一个服务器程序的开始,但是当我尝试编译时它给了我这些错误.
/* Server */
#include <iostream>
#include <windows.h>
#include <winsock2.h>
using namespace std;
const int winsockVersion = 2;
#define BACKLOG 10
#define PORT 3000
int main(void){
WSADATA wsadata;
if (WSAStartup(MAKEWORD(winsockVersion,0),&wsadata) == 0){
struct addrinfo hints, *res;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if ( getaddrinfo(NULL,PORT,&hints,&res) == 0 ){
cout<<"-Call to get addrinfo successful!." << endl;
}
cout<<"res af_family" << res->ai_family << endl;
}
//clear stuff
if( WSACleanup() != 0){
cout<<"-WSACleanup unsuccessful" << endl;
}else{
cout<<"-WSACleanup …Run Code Online (Sandbox Code Playgroud) 我想创建一个只向客户端发送数据的Winsock UDP套接字.我希望内核为我选择一个可用的端口.另一方面,我想指出要使用哪个本地IP,因为我正在运行一些nics.
我已经尝试梳理套接字选项的迷宫,以及与套接字地址设置为0的端口绑定无效.
我的代码是在Win32 C++中.
WSAStartup函数如何启动Winsock DLL的使用?
根据文件
WSAStartup函数必须是应用程序或DLL调用的第一个Windows套接字函数.它允许应用程序或DLL指定所需的Windows套接字版本,并检索特定Windows套接字实现的详细信息.应用程序或DLL只能在成功调用WSAStartup后发出更多Windows套接字函数.
这个函数初始化WSADATA数据结构,但在socket编程,我们不传递WSDATA任何功能,因此程序如何来了解Windows套接字版本和其他细节?
例如,在此代码中
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32")
void Run(int argc, char* argv[])
{
char* host = argc < 2 ? "" : argv[1];
struct hostent* entry = gethostbyname(host);
if(entry)
{
struct in_addr* addr = (struct in_addr*) entry->h_addr;
printf("IP Address: %s\n", inet_ntoa(*addr));
}
else
printf("ERROR: Resolution failure.\n");
}
int main(int argc, char* argv[])
{
WSADATA wsaData;
if(WSAStartup(0x202, &wsaData) == 0)
{
Run(argc, argv);
WSACleanup();
}
else
printf("ERROR: Initialization failure.\n");
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我正在 …
在Unix 一切都是文件的函数方法read(),write(),close()不支持在Win32.
我想效仿,但不知道如何时区分sock是插座或FD上WinSocks2.
//returns 1 if `sock` is network socket,
// 0 if `sock` is file desriptor (including stdio, stderr, stdout), ...
// -1 in none of above
int is_net_socket(int sock)
{
// ...?
}
Run Code Online (Sandbox Code Playgroud)
这应该如下:
int mysock = socket(PF_INET, SOCK_STREAM, 0);
int myfd = _open("my_file.txt", _O_RDONLY);
printf("1: %d 2: %d 3: %d 4:%d\n",
is_net_socket(mysock), //1
is_net_socket(myfd), //0
is_net_socket(stdin), //0
is_net_socket(stderr)); //0
// should print "1: 1 …Run Code Online (Sandbox Code Playgroud) 如果数据被发送到客户端但客户端正在忙于执行其他操作,那么使用recvfrom()读取数据可以使用多长时间?
此外,如果在读取第一个数据包之前发送第二个数据包会发生什么情况,第一个数据包是丢失的还是下一个数据包正在等待读取?
(windows - udp)
我包含了MySQL C库所要求的内容.
VS2010中的自动完成也显示出 - 任何想法是什么?
它们是否可以互换,是否有任何优势?
谢谢!
我一直在关注Beej Networking指南,在服务器部分,有一部分代码叫做函数fork().
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
if (send(new_fd, "Hello, world!", 13, 0) == -1)
perror("send");
close(new_fd);
exit(0);
Run Code Online (Sandbox Code Playgroud)
我在Windows机器上,不能让那部分工作.我能做些什么来解决这个问题?我的代码如下.
/* Server */
#define _WIN32_WINNT 0x501
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <sys/types.h>
using namespace std;
const int winsockVersion = 2;
#define BACKLOG 10
#define PORT "3000"
int main(void){
WSADATA wsadata;
if (WSAStartup(MAKEWORD(winsockVersion,0),&wsadata) == 0){
cout<<"-WSAStartup initialized..." << endl;
int status;
int sockfd, …Run Code Online (Sandbox Code Playgroud)