Fone
一般會員
發表:4 回覆:2 積分:1 註冊:2004-07-14
發送簡訊給我
|
想請教一下..要如何利用multithread的方式..設計一支可以同時接收與發送資料的程式..?! 要如何將下面的程式..整合成用multithread的方法來達到..可以同時接收與發送資料的程式..?!煩請大家了..不才的小弟我想了好久..><.. 若是有其他的方法..可否也教導一下不才的小弟我..^^.. /* tcp.h
* Definitions for TCP client/server programs.
*/
#include
#include
#include
#include
#include
#define SERV_UDP_PORT 6001
#define SERV_TCP_PORT 6001
#define SERV_HOST_ADDR "140.118.21.106"
#define MAXLINE 512
char *pname;
------------------------------------------------------
/* tcpserv.c
* Example of server using TCP protocol.
*/
#include
#include
#include
#include
#include
#include "tcp.h" void tcp_server(); main(argc, argv)
int argc;
char *argv[];
{
int sockfd, newsockfd, clilen, childpid;
int status;
struct sockaddr_in cli_addr, serv_addr; pname = argv[0]; /* Open a TCP socket (an Internet stream socket)*/
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("server: can't open stream socket");
exit();
} /* Bind local address so that the client can send to us */
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(SERV_TCP_PORT); if (bind(sockfd,(struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0){
perror("server: can't bind local address");
exit();
} listen(sockfd, 5);
clilen = sizeof(cli_addr); for ( ; ; ) {
/*
* Wait for a connection from a client process.
* This is an example of a concurrent server.
*/ newsockfd=accept(sockfd,(struct sockaddr *)
&cli_addr,&clilen); if (newsockfd < 0){
perror("server: accept error");
continue;
} if ( (childpid = fork()) < 0){
perror("server: fork error"); } else if (childpid == 0) { /* child process */
close(sockfd); /* close original socket */
switch(fork()){
case 0: /* grandchild */
tcp_server(newsockfd,cli_addr);
close(newsockfd);
exit(0);
case -1: /* fork error */
close(newsockfd);
_exit();
default:
close(newsockfd);
exit(0); /* child exit */
}
}else { /* parent process */
wait(&status);
}
}
} void tcp_server(sockfd,cli_addr)
int sockfd;
struct sockaddr_in cli_addr;
{ int n;
char mesg[MAXLINE 1];
char recvbuf[MAXLINE 1]; /* sleep is used to test retransmission,
* uncomment when needed */
/* sleep(5); */
n=recv(sockfd,recvbuf,MAXLINE,0);
recvbuf[n]=0;
sprintf(mesg,"Your message : %s has been received\n",
recvbuf);
write(sockfd,mesg,strlen(mesg));
close(sockfd);
sprintf(mesg,"Message: %s received from %s\n",recvbuf,
inet_ntoa(cli_addr.sin_addr) );
write(2,mesg,strlen(mesg));
}
-------------------------------------------------------
/* tcpcli.c
* Example of client using TCP protocol.
*/ #include
#include
#include
#include "tcp.h"
void tcp_client(); main(argc, argv)
int argc;
char *argv[];
{
int sockfd;
struct sockaddr_in serv_addr; pname = argv[0];
if(argc==3){
printf("Using %s:%s as server \n",argv[1],argv[2]);
memset((char *) &serv_addr, 0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
serv_addr.sin_port=htons((u_short)atoi(argv[2]));
}else{
/* Fill in the structure "serv_addr" with the
* address of the server that we want to connect with.
*/
memset((char *) &serv_addr, 0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(SERV_HOST_ADDR);
serv_addr.sin_port =htons(SERV_TCP_PORT);
} /* Open a TCP socket (an Internet stream socket)*/
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("client: can't open stream socket");
exit();
} /* Connect to the server.*/
if (connect(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0){
perror("client: can't connect to server");
exit();
} tcp_client(sockfd); /* do it all */
close(sockfd);
exit(0);
} void tcp_client(sockfd)
int sockfd;
{
int n;
char mess[MAXLINE 1];
char recvbuf[MAXLINE 1];
printf("Please Input Your Message :");
gets(mess);
write(sockfd,mess,strlen(mess)); n=read(sockfd,recvbuf,MAXLINE);
if(n<0)
perror("error in receving server message !");
recvbuf[n]=0;
fputs(recvbuf,stdout);
}
|