/*Socket可以说是网络编程中重要的一环
相对简单和易懂,以Socket的编程作为切入点相信有很大的益处
下面是我在学习网络编程的时候编写的Socket客户端程序*/
/****************************************************************
*
* This file is the property of MaiWei Cable TV Enquentment Ltd.co.
* The unauthorised use, copy and transfer of all or any part of
* this file is forbidden.
*
****************************************************************/
#include<sys/stat.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include"TCL_socket_fun.h"
#define PORT 5125
#define SERVER_IP "10.128.118.45"
int main()
{
TCL_FD_SET rfds;
TCL_INT32 s;
TCL_SOCKADDR_IN addr;
TCL_CHAR buffer[256];
if((s = TCL_socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family = TCL_AF_INET;
addr.sin_port=TCL_htons(PORT);
addr.sin_addr.is_ip_addrs = inet_addr(SERVER_IP);
*
* This file is the property of MaiWei Cable TV Enquentment Ltd.co.
* The unauthorised use, copy and transfer of all or any part of
* this file is forbidden.
*
****************************************************************/
#include<sys/stat.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include"TCL_socket_fun.h"
#define PORT 5125
#define SERVER_IP "10.128.118.45"
int main()
{
TCL_FD_SET rfds;
TCL_INT32 s;
TCL_SOCKADDR_IN addr;
TCL_CHAR buffer[256];
if((s = TCL_socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family = TCL_AF_INET;
addr.sin_port=TCL_htons(PORT);
addr.sin_addr.is_ip_addrs = inet_addr(SERVER_IP);
/*
TCL_INT32 TCL_connect(TCL_INT32 socketd, struct TCL_SOCKADDR_IN * serverAddr, TCL_INT16 len);
TCL_INT32 TCL_connect(TCL_INT32 socketd, struct TCL_SOCKADDR_IN * serverAddr, TCL_INT16 len);
说明: 客户程序调用connect函数来使客户socket socketd与监听于serverAddr所指定的计算机的特定端口上的服务Socket进行连接。
返回: 0: 成功
SOCKET_ERROR:失败。
参数说明:
socketd:socket ID;
serverAddr:保存对端地址及端口号的结构指针;
len:地址长度,目前保留不使用;
使用说明:默认为阻塞,可以通过fcntl()设置为非阻塞
*/
返回: 0: 成功
SOCKET_ERROR:失败。
参数说明:
socketd:socket ID;
serverAddr:保存对端地址及端口号的结构指针;
len:地址长度,目前保留不使用;
使用说明:默认为阻塞,可以通过fcntl()设置为非阻塞
*/
if(TCL_connect(s,&addr,sizeof(addr))<0)
{
perror("connect");
exit(1);
}
{
perror("connect");
exit(1);
}
while(TCL_TRUE)
{
{
TCL_fd_zero(&rfds);//每次循环都要清空集合,否则不能检测描述符变化
TCL_fd_set(s,&rfds);//添加描述符
TCL_fd_set(STDIN_FILENO,&rfds);//添加描述符
TCL_fd_set(s,&rfds);//添加描述符
TCL_fd_set(STDIN_FILENO,&rfds);//添加描述符
/*
select() 输入输出多路复用
TCL_INT32 TCL_socket_select(TCL_INT32 socketnum_max, TCL_FD_SET * fd1, TCL_FD_SET * fd2, TCL_FD_SET * fd3, TCL_UINT32 num);
select() 输入输出多路复用
TCL_INT32 TCL_socket_select(TCL_INT32 socketnum_max, TCL_FD_SET * fd1, TCL_FD_SET * fd2, TCL_FD_SET * fd3, TCL_UINT32 num);
说明:确定一个或多个socket的状态,如需要则等待,
返回:成功返回0 ,失败返回SOCKET_ERROR
返回:成功返回0 ,失败返回SOCKET_ERROR
参数说明:
socket:需要确定状态的最大socket数目;
fd1: (可选)指针,指向一组等待可读性检查的socket;
fd2: (可选)指针,指向一组等待可写性检查的socket;
fd3: (可选)指针,指向一组等待错误检查的socket;
num:select()最多等待时间,单位为毫秒;0表示不等待,-1表示阻塞操作。
使用说明:。
*/
switch(TCL_socket_select(s+1,&rfds,NULL,NULL,NULL))
{
case TCL_FAILURE: //#define TCL_FAILURE (-1) 发生错误时返回 -1
exit(TCL_FAILURE);
break;
socket:需要确定状态的最大socket数目;
fd1: (可选)指针,指向一组等待可读性检查的socket;
fd2: (可选)指针,指向一组等待可写性检查的socket;
fd3: (可选)指针,指向一组等待错误检查的socket;
num:select()最多等待时间,单位为毫秒;0表示不等待,-1表示阻塞操作。
使用说明:。
*/
switch(TCL_socket_select(s+1,&rfds,NULL,NULL,NULL))
{
case TCL_FAILURE: //#define TCL_FAILURE (-1) 发生错误时返回 -1
exit(TCL_FAILURE);
break;
case TCL_FALSE://#define TCL_FALSE (0) 表示描述词状态改变前已超过 timeout 时间
break; //再次轮询
default :
/*
break; //再次轮询
default :
/*
TCL_INT32 TCL_fd_isset(TCL_INT32 socket, TCL_FD_SET *fd);
说明:查询某socket是否在指定的队列中
返回:
0:不在
1:在
参数说明:
Socket: 指定的socket
fd: 指定socket队列
说明:查询某socket是否在指定的队列中
返回:
0:不在
1:在
参数说明:
Socket: 指定的socket
fd: 指定socket队列
*/
if(TCL_fd_isset(STDIN_FILENO,&rfds))
{
bzero(buffer,sizeof(buffer));//清空buffer
/*
read() 将参数STDIN_FILENO所指向的文件传送sizeof(buffer)个字节到buffer
if(TCL_fd_isset(STDIN_FILENO,&rfds))
{
bzero(buffer,sizeof(buffer));//清空buffer
/*
read() 将参数STDIN_FILENO所指向的文件传送sizeof(buffer)个字节到buffer
STDIN_FILENO 是标准输入的文件描述符
详见/usr/include/unistd.h
详见/usr/include/unistd.h
代码:
Standard file descriptors
Standard file descriptors
#define STDIN_FILENO 0 Standard input.
#define STDOUT_FILENO 1 Standard output.
#define STDERR_FILENO 2 Standard error output.
*/
read(STDIN_FILENO,buffer,sizeof(buffer));
if(strcmp(buffer,"exit/n") == 0)
{
close(s);
break;
}
#define STDOUT_FILENO 1 Standard output.
#define STDERR_FILENO 2 Standard error output.
*/
read(STDIN_FILENO,buffer,sizeof(buffer));
if(strcmp(buffer,"exit/n") == 0)
{
close(s);
break;
}
if(TCL_socket_send(s,buffer,sizeof(buffer),0)<0)
{
perror("send error");
exit(1);
}
}
if(TCL_fd_isset(s,&rfds))
{
bzero(buffer,sizeof(buffer));
TCL_socket_recv(s,buffer,sizeof(buffer),0);
printf("%s/n",buffer);
}
}//end switch
}//end while
close(s);
return TCL_SUCCESS;
}
{
perror("send error");
exit(1);
}
}
if(TCL_fd_isset(s,&rfds))
{
bzero(buffer,sizeof(buffer));
TCL_socket_recv(s,buffer,sizeof(buffer),0);
printf("%s/n",buffer);
}
}//end switch
}//end while
close(s);
return TCL_SUCCESS;
}