两者connect()和bind()系统调用都将套接字文件描述符"关联"到一个地址(通常是ip/port组合).他们的原型如下: -
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
Run Code Online (Sandbox Code Playgroud)
和
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
Run Code Online (Sandbox Code Playgroud)
2个电话之间的确切区别是什么?应该connect()何时使用何时bind()?
具体来说,在一些示例服务器客户端代码中,发现客户端正在使用connect()而服务器正在使用该bind()调用.理由并不完全清楚.
假如我要获得共享,虚拟或专用托管,我在某处读取服务器/机器一次只能处理64,000个TCP连接,这是真的吗?无论带宽如何,任何类型的托管处理有多少?我假设HTTP通过TCP工作.
这意味着只有64,000个用户可以连接到该网站,如果我想提供更多服务,我必须转移到网络农场吗?
我对如何以及何时使用感到困惑beginBackgroundTaskWithExpirationHandler.
Apple在他们的示例中显示在applicationDidEnterBackground委托中使用它,以便有更多时间来完成一些重要任务,通常是网络事务.
在查看我的应用程序时,似乎我的大多数网络内容都很重要,当一个人启动时,如果用户按下主页按钮,我想完成它.
因此,beginBackgroundTaskWithExpirationHandler为了安全起见,包装每个网络事务(并且我不是在谈论下载大量数据,大多数是短xml)是接受/良好做法 吗?
network-programming objective-c multitasking ios background-thread
这可能是一个非常基本的问题,但它让我感到困惑.
两个不同的连接插座可以共用一个端口吗?我正在编写一个应该能够处理超过10万个并发连接的应用服务器,而且我们知道系统上可用的端口数量大约为60k(16位).连接的套接字被分配给新的(专用)端口,因此这意味着并发连接的数量受端口数量的限制,除非多个套接字可以共享同一个端口.所以问题.
我在这里先向您的帮助表示感谢!
如果您的TCP连接可能太慢并且UDP"连接"可能太不可靠,您使用什么?有各种标准的可靠UDP协议,你有什么经验吗?
请在每个回复中讨论一个协议,如果其他人已经提到您使用的协议,则考虑将其投票并使用评论进行详细说明(如果需要).
我对这里的各种选项感兴趣,其中TCP位于规模的一端而UDP位于另一端.提供了各种可靠的UDP选项,每个选项都带有TCP到UDP的一些元素.
我知道TCP通常是正确的选择,但是有一个备选列表通常可以帮助我们得出结论.像UDP,RUDP等基于UDP构建的东西各有利弊,你使用它们,你的经历是什么?
为了避免疑问,没有更多的信息,这是一个假设的问题,我希望这个问题会引出一个回复列表,详细说明需要做出决定的人可以使用的各种选项和备选方案.
在我在BSD套接字编程的上下文中运行的每个示例和讨论中,似乎将文件描述符设置为非阻塞I/O模式的推荐方法是使用O_NONBLOCK标志fcntl(),例如
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Run Code Online (Sandbox Code Playgroud)
我已经在UNIX中进行了十多年的网络编程,并且一直使用FIONBIO ioctl()调用来执行此操作:
int opt = 1;
ioctl(fd, FIONBIO, &opt);
Run Code Online (Sandbox Code Playgroud)
从来没有真正考虑过为什么.刚学会这种方式.
有没有人对其中一个或两个可能各自的优点有任何评论?我认为可移植性轨迹在某种程度上有所不同,但不知道在多大程度上与ioctl_list(2)单个ioctl方法的那个方面没有对话.
作为最近一个问题的后续内容,我想知道为什么在没有尝试在TCP套接字上进行读/写操作的情况下,为什么Java不可能检测到套接字已被对等端正常关闭?无论是使用前NIO Socket还是NIO ,情况似乎都是如此SocketChannel.
当对等体正常关闭TCP连接时,连接两端的TCP堆栈都知道这一事实.服务器端(启动关闭的那个)最终处于状态FIN_WAIT2,而客户端(未明确响应关闭的那个)最终处于状态CLOSE_WAIT.为什么没有一个方法Socket或SocketChannel可以查询TCP堆栈看到底层的TCP连接是否已经终止?是不是TCP堆栈没有提供这样的状态信息?或者这是一个设计决定,以避免昂贵的内核调用?
在已经发布了这个问题的答案的用户的帮助下,我想我会看到问题可能来自哪里.未明确关闭连接的一方最终处于TCP状态,CLOSE_WAIT这意味着连接正在关闭并等待一方发出自己的CLOSE操作.我认为isConnected返回true和isClosed返回是公平的false,但为什么不存在类似的东西isClosing呢?
以下是使用pre-NIO套接字的测试类.但使用NIO可获得相同的结果.
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) throws Exception {
final ServerSocket ss = new ServerSocket(12345);
final Socket cs = ss.accept();
System.out.println("Accepted connection");
Thread.sleep(5000);
cs.close();
System.out.println("Closed connection");
ss.close();
Thread.sleep(100000);
}
}
import java.net.Socket;
public class MyClient {
public static …Run Code Online (Sandbox Code Playgroud) 我不太确定如何获取机器的外部IP地址,因为网络外的计算机会看到它.
我的以下IPAddress类仅获取计算机的本地IP地址.
public class IPAddress {
private InetAddress thisIp;
private String thisIpAddress;
private void setIpAdd() {
try {
InetAddress thisIp = InetAddress.getLocalHost();
thisIpAddress = thisIp.getHostAddress().toString();
} catch (Exception e) {
}
}
protected String getIpAddress() {
setIpAdd();
return thisIpAddress;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个PHP Web应用程序,我需要在请求中执行一些网络操作,例如根据用户的请求从远程服务器获取某人.
是否有可能在PHP中模拟异步行为,因为我必须将一些数据传递给函数并且还需要从它输出.
我的代码是这样的:
<?php
$data1 = processGETandPOST();
$data2 = processGETandPOST();
$data3 = processGETandPOST();
$response1 = makeNetworkCall($data1);
$response2 = makeNetworkCall($data2);
$response3 = makeNetworkCall($data3);
processNetworkResponse($response1);
processNetworkResponse($response2);
processNetworkResponse($response3);
/*HTML and OTHER UI STUFF HERE*/
exit;
?>
Run Code Online (Sandbox Code Playgroud)
在发出3个请求时,每个网络操作大约需要5秒钟才能完成为应用程序的响应时间添加总计15秒.
makeNetworkCall()函数只是执行HTTP POST请求.
远程服务器是第三方API,所以我没有任何控制权.
PS:请不要回答关于AJAX或其他事情的建议.我目前正在寻找是否可以通过PHP实现这一点,可能是C++扩展或类似的东西.
sockets ×6
tcp ×4
c ×2
java ×2
asynchronous ×1
external ×1
hosting ×1
http ×1
ios ×1
ip-address ×1
multitasking ×1
networking ×1
objective-c ×1
php ×1
port ×1
tcplistener ×1
udp ×1
unix ×1