① vc 如何多线程处理CSocket数据
因为CSocket类要用到窗口的消息机制才能进行收发,所以用线程可以这样用的,你可以参考用如下的方法:
CMySocket*
pSocket;
...
ThreadFunc(
)
{
pSocket
=
new
CSocket;
pSocekt->Create();
pSocket->Connect(...);
while(...)
{
MSG
msg;
Sleep(
5
);
if
(
::PeekMessage(&msg,
NULL,
NULL,
NULL,
PM_REMOVE
)
)
{
::TranslateMessage(
&msg
);
::DispatchMessage(
&msg
);
}
。。。
//线程的其他代码
);
}
希望以上的代码对你有用
② linux中多个进程公用一个socket的问题
从设计上来说, 设计成多线程比较好,可以实现同时工作 (CUP 使用时间分片机制).至于套节字,分开来使用更简单,通信双方也能更好解析信息.如果要考虑共用一个套节字,需要使用互斥机制.
③ 刚介入linux c的socket编程没多久,想要写一个socket客户端,实现多线程处理发送和接收,哪位大侠帮帮忙啊
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
void *yourfunction(void *connect_fd)
{
int connfd = *((int *)connect_fd);
。。。。
} //你没说具体的应用,所以只能写这么多了。在这里面直接对connfd调用read和write函数就可以和客户端收发数据了。
//补充:是啊 返回给客户端什么信息啊?
int main(void)
{
int sockfd, n, connfd;
pthread_t tid;
struct sockaddr_in servaddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
perror("socket:");
exit(1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
n = bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if (n == -1)
{
perror("bind:");
exit(1);
}
n = listen(sockfd, 20);
if (n == -1)
{
perror("listen:");
exit(1);
}
while (1)
{
connfd = accept(sockfd, (struct sockaddr *)&servaddr, NULL);
pthread_create(&tid, NULL, yourfunction, (void *)&connfd);
}
return 0;
}
④ linux c socket 如何实现一个进程多个线程,每个线程管理多个socket连接
大家仔细看,楼主的题目还是很有难度的呢,一个进程多个线程容易实现,但是要让这些线程中每个线程都管理多个socket连接,确实比较难~~坐等高手。
不过一般都是一个线程处理一个socket连接,这种例子是:
(取自书上,仅供学习,直接编译肯定通不过,少书上其他代码)
==================================================
/* include serv06 */#include "unpthread.h"
intmain(int argc, char **argv)
{
int listenfd, connfd;
void sig_int(int);
void *doit(void *);
pthread_t tid;
socklen_t clilen, addrlen;
struct sockaddr *cliaddr;
if (argc == 2) listenfd = Tcp_listen(NULL, argv[1], &addrlen);
else if (argc == 3)
listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
else
err_quit("usage: serv06 [ <host> ] <port#>");
cliaddr = Malloc(addrlen);
Signal(SIGINT, sig_int);
for ( ; ; ) { clilen = addrlen;
connfd = Accept(listenfd, cliaddr, &clilen);
Pthread_create(&tid, NULL, &doit, (void *) connfd); }
}
void *doit(void *arg)
{
void web_child(int);
Pthread_detach(pthread_self()); web_child((int) arg);
Close((int) arg);
return(NULL);
}
/* end serv06 */
voidsig_int(int signo)
{
void pr_cpu_time(void);
pr_cpu_time(); exit(0);
}
================================================================
⑤ linux socket编程 双线程同时读写缓冲流时为什么fprintf被阻塞了
你用fprintf读写socket?如果是,那么应该改成send或者write因为fprintf第一个参数为FILE *而文件描述符的是int类型上就有问题。如果不是,那么会不会两个线程同时读取一个socket接口,而当时数据正好被另一个线程所读取,而导致一个线程所阻塞。
⑥ CSocket实现多线程通信的问题
我以前写的多线程的服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <ctype.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MAXLINE 4096
fd_set allset, readyset;
int client[FD_SETSIZE];
int maxfd, max_client;
pthread_mutex_t work[3] = {PTHREAD_MUTEX_INITIALIZER};
void *gaa( void *arg )
{
char buf[MAXLINE];
int len, j, fd = *((int * )arg);
if ( read( fd, buf, MAXLINE ) )
{
pthread_mutex_lock( &work[0] );
printf( "receive form clinet %s", buf );
pthread_mutex_unlock( &work[0] );
len = strlen( buf );
for( j = 0; j < len; j++ )
buf[j] = toupper( buf[j] );
write( fd, buf, len + 1 );
}
else
{
pthread_mutex_lock( &work[1] );
printf( "fd close %d\n",fd );
pthread_mutex_unlock( &work[1] );
close( fd );
pthread_mutex_lock( &work[2] );
FD_CLR( fd, &allset );
*((int *)arg) = -1;
pthread_mutex_unlock( &work[2] );
}
return NULL;
}
void add_new_client( int sockfd )
{
struct sockaddr_in guest;
socklen_t len = sizeof( guest );
int fd, i;
char str[INET_ADDRSTRLEN];
fd = accept( sockfd, ( struct sockaddr * )&guest, &len );
printf( "receive from %s at port %d\n", inet_ntop( PF_INET, &guest.sin_addr, str, sizeof(str ) ),
ntohs( guest.sin_port ) );
FD_SET( fd, &allset );
if( fd > maxfd ) maxfd = fd;
for( i = 0; i < FD_SETSIZE; i++ )
if( client[i] == -1 )
{
client[i] = fd;
break;
}
if( i > max_client )
max_client = i;
}
void serve_client()
{
int i, fd, count = 0;
pthread_t pit[FD_SETSIZE];
for( i = 0; i < max_client; i++ )
{
if ( ( fd = client[i] ) == -1 )
continue;
if ( FD_ISSET( fd, &readyset ) )
{
pthread_create( &pit[i], NULL, gaa, (void *)&client[i] );
count++ ;
}
}
for( i = 0; i < count; i++ )
pthread_join( pit[i], NULL );
}
int main ()
{
struct sockaddr_in serv, guest;
int sockfd, confd;
int i, nready;
bzero( &serv, sizeof( serv ) );
serv.sin_family = PF_INET;
serv.sin_port = htons ( 8000 );
serv.sin_addr.s_addr = htonl( INADDR_ANY );
sockfd = socket( PF_INET, SOCK_STREAM, 0 );
bind( sockfd, ( struct sockaddr * )&serv, sizeof( serv ) );
listen( sockfd, 1024 );
printf( "Accepting connection.......\n" );
FD_ZERO( &allset );
FD_SET( sockfd, &allset );
maxfd = sockfd;
for( i = 0; i < 1024; i++ )
client[i] = -1;
max_client = -1;
while ( 1 )
{
readyset = allset;
nready = select( maxfd + 1, &readyset, NULL, NULL, NULL );
if( FD_ISSET( sockfd, &readyset ) )
{
add_new_client( sockfd );
nready--;
}
if( nready )
serve_client();
}
return 0;
}
看看对你有帮助吗
⑦ linux c后端 socket服务线程怎么变成一直运行在后台的线程服务,让它跟着整个程序生命周
写成服务,加到开机启动脚本下面,简单的直接写个脚本放到/etc/init.d, 实现start stop restart
也可以写守护进程
⑧ linux下的 socket编程问题!
第一个问题:
对,是那样的,用open打开文件,用read读取文件,在发送给对方,接收方接收到后,写入文件就可以了。不过在这个过程中最好别用字符串函数,除非你很熟悉。
第二个问题
首先你得去搞清楚什么是线程,什么是进程,fork出来的叫进程,pthread_create出来的才叫线程。服务器有很多种模型(多进程,多线程,select,epoll模型,这个我的blog上有,famdestiny.cublog.cn),不一定要用多进程。
给你写了个代码,自己先看看:
注意,在自己的目录下创建一个叫pserverb的文件,程序会把这个文件复制成test文件。你可以自己根据需要改改
server:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define SERV_PORT 5358
#define MAX_CONN 10
#define BUF_LEN 1024
void str_echo(FILE *fp, int sockfd){
ssize_t nread;
int file_fd;
char buf[BUF_LEN] = {0};
file_fd = open("test", O_WRONLY | O_TRUNC | O_CREAT, 0755);
while(1) {
bzero(buf, BUF_LEN);
if((nread = read(sockfd, buf, BUF_LEN)) == -1) {
if(errno == EINTR) {
continue;
}
else {
printf("readn error: %s\n", strerror(errno));
continue;
}
}
else if (nread == 0) {
break;
}
else {
printf("%s\n", buf);
write(file_fd, buf, nread);
}
}
close(file_fd);
}
void sig_chld(int sig){
pid_t pid;
int state;
while((pid = waitpid(-1, &state, WNOHANG)) > 0){
printf("child process %d exited.", pid);
}
return;
}
int main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t cliaddrlen;
pid_t childpid;
struct sockaddr_in servaddr, cliaddr;
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
printf("socket error: %s\n", strerror(errno));
return 0;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){
printf("bind error: %s\n", strerror(errno));
return 0;
}
if(listen(listenfd, MAX_CONN) == -1){
printf("listen error: %s\n", strerror(errno));
return 0;
}
signal(SIGCHLD, sig_chld);
while(1){
cliaddrlen = sizeof(cliaddr);
if((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen)) == -1){
if(errno == EINTR){
continue;
}
else{
printf("accept error: %s\n", strerror(errno));
continue;
}
}
if((childpid = fork()) == 0){
close(listenfd);
str_echo(stdin, connfd);
exit(0);
}
else if(childpid > 0){
close(connfd);
}
else{
printf("fork error!\n");
continue;
}
}
}
client:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define SERV_ADDR "127.0.0.1"
#define SERV_PORT 5358
#define BUF_LEN 1024
void str_cli(char *path, int sockfd)
{
char sendbuf[BUF_LEN] = {0};
int fd, n;
if((fd = open("./pserverb", O_RDONLY)) == -1){
printf("%s\n", strerror(errno));
exit(0);
}
while((n = read(fd, sendbuf, BUF_LEN)) != 0) {
if(n < 0){
printf("%s\n", strerror(errno));
exit(0);
}
write(sockfd, sendbuf, n);
bzero(sendbuf, BUF_LEN);
}
close(fd);
return;
}
int main(int argc, char **argv)
{
int fd;
struct sockaddr_in servaddr;
fd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(SERV_ADDR);
servaddr.sin_port = htons(SERV_PORT);
if (connect(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
printf("connect error: %s\n", strerror(errno));
return 0;
}
str_cli(argv[1], fd);
return 0;
}
⑨ linux中socket怎么实现同时收发数据,在我的系统中,需要向服务器发送数据,服务器也要向客户度发数据
可以的 线程是共享内存空间的 因此在使用多线程的情况下,要做好线程同步的工作,要对
不同线程访问的内存数据进行加锁处理
⑩ CSocket类和多线程
如果m_client是CMyDlg的成员的话,得到dlg的指针自然可以得到成员了;
这里需要注意的是MFC的很多对象都有不是线程安全的,特别是窗口对象,
如果只是通过窗口指针使用成员不会有问题,但是CSocket也不是线程安全的。
》》》》补充:
最好是将CSocket及dlg相关操作放在dlg内部,通过消息机制触发,
例如dlg中增加自定义消息函数sendData
线程中适当的时候向窗口发送自定义消息触发sendData,
其中,sendData函数如果涉及到共用数据结构的读写,自己保证线程同步。