运行基本ok!(第三版修改结果)
服务器server端:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <bits/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
//后续优化目标:
//更完善的socket多了链表、事件、SSL、结构体封装以及宏定义、更完整的判断返回/处理错误语句。
void usage()
{
printf("usage:\n");
printf("-p: server listen port\n");
printf("eg: ./tcp_server -p 8080\n");
}
int main(int argc, char *argv[])
{
int port = 0;
int ch = 0;
while(1)
{
static struct option opts[]=
{
{"port", 1, NULL, 'p'},
{0, 0, 0, 0}
};
ch = getopt_long(argc, argv, "p:", opts, NULL);
if(ch == -1){
break;
}
switch (ch)
{
case 'p':
port = atoi(optarg);
break;
default:
usage();
return -1;
}
}
if(!port){
usage();
return -1;
}
printf("port:%d\n", port);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket is error!\n");
return -1;
}
printf("socket ok!\n");
struct sockaddr_in server_addr, client_addr, peer_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = INADDR_ANY;
int on = 1;
if((setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) <0 ) //设置端口可重用,能重复绑定套接字
{
perror("setsockopt failed!\n");
return -2;
}
if(bind(sockfd, (struct sockaddr*)&s