学习 ing linux 下的网络编程 在 入门的socket中 就碰了不少bbbbbb壁
服务器 服务器的程序要开启(绑定 监听 )
客户端 客户端去申请服务
服务器回应客户 (服务器可能同时 接收多个客户端的服务申请 所以有个服务器的监听队列 )
该例子中用 accept的函数 使服务器进入睡眠 直到监听到有客户申请
问题是 “address already use ” 即使在使用 setsockopt之后,
linux下的时间调用:来自http://wenwen.sogou.com/z/q311998900.htm
Linux 套接字编程中的 5 个隐患:http://www.ibm.com/developerworks/cn/linux/l-sockpit/
client段收到的时间后面有乱码:在srever.c 中的 write函数中写的大小 改为(strlen(buf)+1) 把'\0'写入
或者直接写100 接收的 buf大小一致
#include "socket_includes.h"
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in servaddr;
char buf[100];
int bytes;
if(( sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 )
{
perror("socket error");
return -1;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr= inet_addr("127.0.0.1");
servaddr.sin_port = htons(9999);
//改端口与服务器的端口对应。
if( connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0 )
{
perror("connect error");
return 0;
}
bytes = read(sockfd, buf,100);
if(bytes < 0){
printf("Error, read failed.\n");
return -1;
}
if(0 == bytes){
printf("Server close connection.\n");
return -1;
}
printf("Time:%s\n",buf);
//printf("Read bytes %d\n", bytes);
close(sockfd);
}
#include "socket_includes.h"
int main(int argc, char *argv[])
{
int listenfd, sockfd, opt = 1;
struct sockaddr_in server, client;
char buf[200];
socklen_t len;
time_t timep;//time_t结构
int ret;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0)
{ perror("Create socket fail.");
return -1;
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(9999);
//改端口与客户端 端口对应 若在调用setsockopt后还出现 “addres already use” 可以尝试换个端口
// 因为改端口可能被其他应用 占用 否则尝试关闭该端口在用
server.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listenfd, (struct sockaddr *)&server,sizeof(server))<0)
//bind before listen
{
perror("bind error.");
return -1;
}
listen(listenfd, MAX_LISTEN_QUE);//queue of the listen
if((ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,(char *) &opt, sizeof(opt))) < 0)
//for the error " Address already in use " when running 这里设置了端口可复用
{
perror("Error, set socket reuse addr failed");
return -1;
}
len = sizeof(client);
while(1){
sockfd = accept(listenfd, (struct sockaddr *)&client, &len);
if(sockfd < 0){
perror("accept error.");
return -1;
}
time(&timep);
snprintf(buf, sizeof(buf), "%s", ctime(&timep));
write(sockfd, buf,(strlen(buf)+1)); //若改为 strlen(buf) client 打印会有乱码
printf("Bytes:%d\n", strlen(buf));
printf("sockfd=%d\n", sockfd);
printf("time:%s",ctime(&timep));
close(sockfd);
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include