C/C++ code//服务端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define MYPORT 3490 /*定义用户连接端口*/
#define BACKLOG 10 /*多少等待连接控制*/
int main(int argc, char *argv[])
{
int sockfd, new_fd/* listen on sock_fd, new connection on new_fd*/
struct sockaddr_in my_addr/* my address information */
struct sockaddr_in their_addr/* connector's address information */
int sin_size
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket")
exit(1)
}
int opt = 1
int len = sizeof(opt)
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, len)
my_addr.sin_family = AF_INET/* host byte order */
my_addr.sin_port = htons(MYPORT)/* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY/* auto-fill with my IP */
bzero(&(my_addr.sin_zero),0)/* zero the rest of the struct */
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
{
perror("bind")
exit(1)
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen")
exit(1)
}
while(1) { /* main accept() loop */
sin_size = sizeof(struct sockaddr_in)
printf("while\n")
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
perror("accept")
continue
}
printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr))
while(1)
{
usleep(10000000)
if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
perror("send")
}
close(new_fd)
exit(0)
}
return 0
}
C/C++ code//客户端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netdb.h>
#define PORT 3490 /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */
int main(int argc, char *argv[])
{
int sockfd, numbytes
char buf[MAXDATASIZE]
struct hostent *he
struct sockaddr_in their_addr/* connector's address information */
if (argc != 2)
{
fprintf(stderr,"usage: client hostname\n")
exit(1)
}
if ((he=gethostbyname(argv[1])) == NULL)
{ /* get the host info */
herror("gethostbyname")
exit(1)
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket")
exit(1)
}
their_addr.sin_family = AF_INET/* host byte order */
their_addr.sin_port = htons(PORT)/* short, network byte order */
their_addr.sin_addr = *((struct in_addr *)(he->h_addr))
bzero(&(their_addr.sin_zero),0)/* zero the rest of the struct */
if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
{
perror("connect")
exit(1)
}
while(1)
{
printf("receiving......\n")
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
perror("recv")
exit(1)
}
buf[numbytes] = '\0'
printf("Received: %s\n",buf)
}
close(sockfd)
return 0
}
另外,在网上看到一种利用TCP协议栈中的KeepAlive探测的方法,下面是我从网上找的用的比较多的一段代码,这里应该只是设置了一些属性参数,但不知具体怎样在通信中检测断开,请高手赐教。
C/C++ code#include
……
////KeepAlive实现
//下面代码要求有ACE,如果没有包含ACE,则请把用到的ACE函数改成linux相应的接口
int keepAlive = 1//设定KeepAlive
int keepIdle = 5//开始首次KeepAlive探测前的TCP空闭时间
int keepInterval = 5//两次KeepAlive探测间的时间间隔
int keepCount = 3//判定断开前的KeepAlive探测次数
if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!\n")))
}
if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!\n")))
}
if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!\n")))
}
if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!\n")))
}
tcp连接本身就是有状态的...何必要依靠发送数据来确定...第一,不管服务器还是客户端断开连接,另一端必定会收到socket连接断开的异常
第二,在socket发送数据前,可以检查 socket.isConnected() 来判断连接是否存在
第三,假设服务器没有开启,connect动作就不应该会执行下去,直接就抛错了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)