#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
if(argc != 3){
printf("%s %s %d\n",__FILE__,__FUNCTION__,__LINE__);
exit(1);
}
int soc_fd = socket(AF_INET,SOCK_STREAM,0);
if(soc_fd < 0){
perror("socket error");
exit(1);
}
int on =1;
setsockopt(soc_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[2]));
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
int ret_connect = connect(soc_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(ret_connect<0){
perror("connect error");
exit(1);
}
fd_set myset;
char buf[20];
int ret_recv;
while(1){
FD_ZERO(&myset);
FD_SET(0,&myset);
FD_SET(soc_fd,&myset);
select(soc_fd+1,&myset,NULL,NULL,NULL);
if(FD_ISSET(0,&myset)){
bzero(buf,sizeof(buf));
gets(buf);
send(soc_fd,buf,strlen(buf),0);
}
if(FD_ISSET(soc_fd,&myset)){
bzero(buf,sizeof(buf));
ret_recv = recv(soc_fd,buf,sizeof(buf),0);
if(ret_recv==0){
close(soc_fd);
break;
}
printf("%s\n",buf);
}
}
return 0;
}
#include "link.h"
int main(int argc,char *argv[])
{
if(argc!=3){
perror("argc error");
exit(1);
}
char ch[100] = {};
char buf[100] = {};
int send_fd;
int socket_fd = socket(AF_INET,SOCK_STREAM,0);
if(socket_fd==-1){
perror("socket error");
exit(1);
}
int on=1;
setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[2]));
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
int bind_ret = bind(socket_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(bind_ret==-1){
perror("bind error");
exit(1);
}
listen(socket_fd,5);
plink Describe_Link;
plink temp_link;
int temp_fd;
fd_set recv_set;
int accept_ret;
int Max_nfds = socket_fd;
int ret;
Init_Link(&Describe_Link);
while(1){
FD_ZERO(&recv_set);
FD_SET(0,&recv_set);
FD_SET(socket_fd,&recv_set);
display(Describe_Link,&recv_set);
select(Max_nfds+1,&recv_set,NULL,NULL,NULL);
if(FD_ISSET(socket_fd,&recv_set)){
accept_ret = accept(socket_fd,NULL,NULL);
printf("客户端%d已连接......\n",accept_ret);
Insert_Link_Head(Describe_Link,accept_ret);
Max_nfds = Find_Link_Node(Describe_Link,0);
}
if(FD_ISSET(0,&recv_set)){
bzero(buf,sizeof(buf));
bzero(ch,sizeof(ch));
gets(ch);
sscanf(ch,"%d:%s",&send_fd,buf);
send(send_fd,buf,strlen(buf),0);
}
temp_link = Describe_Link->next;
while(temp_link != Describe_Link){
if(FD_ISSET(temp_link->data,&recv_set)){
bzero(ch,sizeof(ch));
ret = recv(temp_link->data,ch,sizeof(ch),0);
if(ret == 0){
temp_fd = temp_link->data;
Del_Link_Data(Describe_Link,temp_link->data);
printf("客户端%d已断开连接......\n",temp_fd);
close(temp_fd);
break;
}
printf("客户端%d发送的消息为:%s\n",temp_link->data,ch);
}
temp_link = temp_link->next;
}
}
return 0;
}
#include "link.h"
void Init_Link(plink *P_Link)
{
*P_Link = (plink)malloc(sizeof(link));
if(*P_Link==NULL){
printf("*P_Link malloc error %s\n",__FUNCTION__);
return;
}
(*P_Link)->next = *P_Link;
}
plink Creat_Node(datatype d)
{
plink P_Link = (plink)malloc(sizeof(link));
if(P_Link==NULL){
printf("Creat_Node malloc error %s\n",__FUNCTION__);
return;
}
P_Link->data = d;
P_Link->next = P_Link;
return P_Link;
}
void Insert_Link_Head(plink head,datatype data)
{
if(head == NULL){
return ;
}
plink node = Creat_Node(data);
if(node == NULL){
printf("Creat_Node malloc error %s\n",__FUNCTION__);
}
node->next = head->next;
head->next = node;
}
void Insert_Link_Tail(plink head,datatype data)
{
if(head == NULL){
return ;
}
plink p = head->next;
while(p->next != head){
p = p->next;
}
plink node = Creat_Node(data);
if(node == NULL){
printf("Creat_Node malloc error %s\n",__FUNCTION__);
}
node->next = p->next;
p->next = node;
}
void Del_Link_Data(plink head,datatype data)
{
if(head==NULL){
return;
}
plink p = head;
plink old_node;
while(p->next!=head){
if(p->next->data == data){
old_node=p->next;
p->next = p->next->next;
old_node->next = NULL;
free(old_node);
continue;
}
p = p->next;
}
}
void Updata_Link(plink head,datatype Old_data,datatype New_data)
{
if(head==NULL){
return;
}
plink p = head;
plink old_node;
while(p->next!=head){
if(p->next->data == Old_data){
old_node=p->next;
plink New_node=Creat_Node(New_data);
if(New_node == NULL){
return;
}
New_node->next=p->next->next;
p->next = New_node;
old_node->next = NULL;
free(old_node);
continue;
}
p = p->next;
}
}
datatype Find_Link_Node(plink head,datatype data)
{
if(head==NULL){
return;
}
plink p = head->next;
while(p!=head){
if(p->data > data){
data = p->data;
}
p = p->next;
}
return data;
}
void display(plink head,fd_set *recv_set)
{
if(head == NULL){
return ;
}
plink p = head->next;
while(p!=head){
FD_SET(p->data,recv_set);
p = p->next;
}
}
void display_value(plink head)
{
if(head == NULL){
return ;
}
plink p = head->next;
while(p!=head){
printf("%d\n",p->data);
p = p->next;
}
}
#ifndef __LINK___
#define __LINK___
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
typedef int datatype;
typedef struct linklist{
datatype data;
struct linklist *next;
}link,*plink;
extern void Init_Link(plink *P_Link);
extern void Insert_Link_Head(plink head,datatype data);
extern void display(plink head,fd_set *recv_set);
extern void Insert_Link_Tail(plink head,datatype data);
extern void Del_Link_Data(plink head,datatype data);
extern void Updata_Link(plink head,datatype Old_data,datatype New_data);
extern datatype Find_Link_Node(plink head,datatype data);
extern void display_value(plink head);
#endif