/*****************************************************************************
File name: tcp_client
Description: 多线程tcp客户端
Author: 作者
Version: 版本
Date: 2012.2.22
Input: 客户端要发送的数据指针 *send
服务器发来的数据指针 *recv
Output: 无
History: 修 改 历 史 记 录 列 表 , 每 条 修 改 记 录 应 包 括 修 改 日 期 、 修 改
者及修改内容简述。
*****************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <pthread.h>
#include <arpa/inet.h>
#define PortnumberSend 3333
#define PortnumberRecv 4444
/*************************************************
Function: // ping
Description: // 线程调用函数,读取服务器发来的数
Input: // 通过指针将服务器发送来的数传递到进程中
Output: // 无
Return: // 无
Others: // 调试不通过 出现段错误
*************************************************/
//void *ping(void)
//{
// system("ping 192.168.0.1");
//}
/*************************************************
Function: // tcp_read
Description: // 线程调用函数,读取服务器发来的数
Input: // 无
Output: // 通过指针将服务器发送来的数传递到进程中*arg
Return: // 无
Others: // 其它说明
*************************************************/
void *tcp_read(void *arg)
{
int nbytes;
int sockfd;
char buffer_read[1024];
struct sockaddr_in server_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr)); // 初始化,置0
server_addr.sin_family=AF_INET; // IPV4
server_addr.sin_port=htons(PortnumberRecv); // (将本机器上的short数据转化为网络上的short数据)端口号
server_addr.sin_addr.s_addr=inet_addr("192.168.0.1"); // 绑定的固定IP地址,这个地方可以修改地址
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
//fprintf(stderr,"Connect Error1:%s\a\n",strerror(errno));
printf("no string received! \n");
}
/* 读取服务器发来的数据*/
if((nbytes=read(sockfd,buffer_read,2048))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
printf(" no string is received!\n");
}
buffer_read[nbytes+1]='\0';
printf("Client received from server :%s\n",buffer_read);
/* 结束通讯 */
close(sockfd);
sleep(10);
}
/*************************************************
Function: // tcp_write
Description: // 线程调用函数,将主进程中数据发
送到服务器
Input: // *arg通过指针将进程中检测到的数据发送到服务器
Output: // 无
Return: // 无
Others: //
*************************************************/
void *tcp_write(void *arg)
{
int sockfd;
char *buffer_write=(char *)arg;
struct sockaddr_in server_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr)); // 初始化,置0
server_addr.sin_family=AF_INET; // IPV4
server_addr.sin_port=htons(PortnumberSend); // (将本机器上的short数据转化为网络上的short数据)端口号
server_addr.sin_addr.s_addr=inet_addr("192.168.0.1"); // 绑定的固定IP地址,这个地方可以修改地址
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
/*向服务器发送数据*/
write(sockfd,buffer_write,strlen(buffer_write));
/* 结束通讯 */
close(sockfd);
printf("The parameter passed from main function is %s \n",buffer_write);
sleep(10);
// return (void *)0;
}
int tcp_client(char *recv,char *send)
{
char *tcp_client_send=send,*tcp_client_recv;
//tcp_client_send=(char *)malloc(1024);
tcp_client_recv=(char *)malloc(1024);
int err1,err2=0,err3;
pthread_t tcp_send,tcp_recv;
while(1)
{
/*创建线程1 发送*/
err1=pthread_create(&tcp_send, NULL, tcp_write, (void *)tcp_client_send);
/*等待线程1 结束*/
pthread_join(tcp_send,NULL);
/*创建线程2 接收*/
err2=pthread_create(&tcp_recv, NULL, tcp_read,(void *)tcp_client_recv);
}
if(err1!=0)
{
printf("pthread is not created.\n");
return -1;
}
sleep(1);
printf("pthread is created... \n");
}
void main(void)
{
char *str1="hello world";
char *str2;
str2=(char *)malloc(1024);
while(1)
{
tcp_client(str2,str1);
printf("main server recv from client %s \n",str2);
}
}
File name: tcp_client
Description: 多线程tcp客户端
Author: 作者
Version: 版本
Date: 2012.2.22
Input: 客户端要发送的数据指针 *send
服务器发来的数据指针 *recv
Output: 无
History: 修 改 历 史 记 录 列 表 , 每 条 修 改 记 录 应 包 括 修 改 日 期 、 修 改
者及修改内容简述。
*****************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <pthread.h>
#include <arpa/inet.h>
#define PortnumberSend 3333
#define PortnumberRecv 4444
/*************************************************
Function: // ping
Description: // 线程调用函数,读取服务器发来的数
Input: // 通过指针将服务器发送来的数传递到进程中
Output: // 无
Return: // 无
Others: // 调试不通过 出现段错误
*************************************************/
//void *ping(void)
//{
// system("ping 192.168.0.1");
//}
/*************************************************
Function: // tcp_read
Description: // 线程调用函数,读取服务器发来的数
Input: // 无
Output: // 通过指针将服务器发送来的数传递到进程中*arg
Return: // 无
Others: // 其它说明
*************************************************/
void *tcp_read(void *arg)
{
int nbytes;
int sockfd;
char buffer_read[1024];
struct sockaddr_in server_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr)); // 初始化,置0
server_addr.sin_family=AF_INET; // IPV4
server_addr.sin_port=htons(PortnumberRecv); // (将本机器上的short数据转化为网络上的short数据)端口号
server_addr.sin_addr.s_addr=inet_addr("192.168.0.1"); // 绑定的固定IP地址,这个地方可以修改地址
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
//fprintf(stderr,"Connect Error1:%s\a\n",strerror(errno));
printf("no string received! \n");
}
/* 读取服务器发来的数据*/
if((nbytes=read(sockfd,buffer_read,2048))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
printf(" no string is received!\n");
}
buffer_read[nbytes+1]='\0';
printf("Client received from server :%s\n",buffer_read);
/* 结束通讯 */
close(sockfd);
sleep(10);
}
/*************************************************
Function: // tcp_write
Description: // 线程调用函数,将主进程中数据发
送到服务器
Input: // *arg通过指针将进程中检测到的数据发送到服务器
Output: // 无
Return: // 无
Others: //
*************************************************/
void *tcp_write(void *arg)
{
int sockfd;
char *buffer_write=(char *)arg;
struct sockaddr_in server_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr)); // 初始化,置0
server_addr.sin_family=AF_INET; // IPV4
server_addr.sin_port=htons(PortnumberSend); // (将本机器上的short数据转化为网络上的short数据)端口号
server_addr.sin_addr.s_addr=inet_addr("192.168.0.1"); // 绑定的固定IP地址,这个地方可以修改地址
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
/*向服务器发送数据*/
write(sockfd,buffer_write,strlen(buffer_write));
/* 结束通讯 */
close(sockfd);
printf("The parameter passed from main function is %s \n",buffer_write);
sleep(10);
// return (void *)0;
}
int tcp_client(char *recv,char *send)
{
char *tcp_client_send=send,*tcp_client_recv;
//tcp_client_send=(char *)malloc(1024);
tcp_client_recv=(char *)malloc(1024);
int err1,err2=0,err3;
pthread_t tcp_send,tcp_recv;
while(1)
{
/*创建线程1 发送*/
err1=pthread_create(&tcp_send, NULL, tcp_write, (void *)tcp_client_send);
/*等待线程1 结束*/
pthread_join(tcp_send,NULL);
/*创建线程2 接收*/
err2=pthread_create(&tcp_recv, NULL, tcp_read,(void *)tcp_client_recv);
}
if(err1!=0)
{
printf("pthread is not created.\n");
return -1;
}
sleep(1);
printf("pthread is created... \n");
}
void main(void)
{
char *str1="hello world";
char *str2;
str2=(char *)malloc(1024);
while(1)
{
tcp_client(str2,str1);
printf("main server recv from client %s \n",str2);
}
}