这是一个echo服务器,我不知什么原因好像服务端被阻塞了,也不知道应该怎么调试这样的cs程序。

这是一个echo服务器,我不知什么原因好像服务端被阻塞了,也不知道应该怎么调试这样的cs程序。,第1张

先 netstat -nl | grep 9999 看看是否有进程已经在9999端樱坦辩口侦听,如果有,kill掉那个脊缺进程,或者改用其他端口。然后,用下面修改过的代信蠢码。

至于调试,很简单, 用 gdb 调试 server端即可,由于你是用fork子进程来处理新连接,需要在gdb里 set follow-fork-mode child。具体自己去学gdb吧。或者你改成不用fork,单进程处理,比如用 select/pthread 等手段,这样也比较好调试。

#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <errno.h>

#include <strings.h>

#include <unistd.h>

#define MAXLINE 4096

void echo_write(int sockfd)

ssize_t written(int sockfd, const void *buf, size_t nbytes)

ssize_t readline(int sockfd, void *buf, int maxlen)

int main(int argc, char **argv) {

int listenfd, connfd, len

pid_t pid

struct sockaddr_in servaddr, cliaddr

char bufaddr[MAXLINE]

listenfd = socket(AF_INET, SOCK_STREAM, 0)

servaddr.sin_family = AF_INET

servaddr.sin_addr.s_addr = htonl(INADDR_ANY)

servaddr.sin_port = htons(9999)

bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr))

listen(listenfd, 100)

for( ) {

len = sizeof(cliaddr)

connfd = accept(listenfd, (struct sockaddr*) &cliaddr, &len)

printf("accept ok\n")

if( (pid = fork()) == 0) {

printf("connection from %s : %d\n",

inet_ntop(AF_INET, &cliaddr.sin_addr, bufaddr, sizeof(bufaddr)),

ntohs(cliaddr.sin_port))

close(listenfd)

printf("echo_write start.\n")

echo_write(connfd)

close(connfd)

exit(0)

}

close(connfd)

}

exit(0)

}

void echo_write(int sockfd) {

char buf[MAXLINE]

ssize_t n

printf("let's read.\n")

again:

printf("begin read.\n")

while( (n = readline(sockfd, buf, MAXLINE)) >0) {

printf("n: %d\n", n)

written(sockfd, buf, n)

printf("written ok.\n")

}

if(n <0 &&errno == EINTR) {

goto again

} else if(n <0) {

printf("read error")

}

}

ssize_t readline(int sockfd, void *buf, int maxlen) {

char *ptr, c

ssize_t n, rc

ptr = buf

for(n = 1n <maxlenn++) {

again:

if( (rc = read(sockfd, &c, 1)) == 1) {

*ptr++ = c

if(c == '\n') {

break

}

} else if(rc == 0) {

*ptr = 0

return n - 1

} else {

if(rc <0 &&errno == EINTR) {

goto again

}

return -1

}

}

*ptr = 0

return n

}

ssize_t written(int sockfd, const void *buf, size_t nbytes) {

const char *buf_ptr

size_t nleft = nbytes

ssize_t nwritten

buf_ptr = buf

while(nleft >0) {

if( (nwritten = write(sockfd, buf_ptr, nleft)) <= 0) {

if(nwritten <0 &&errno == EINTR) {

nwritten = 0

} else {

return -1

}

}

nleft -= nwritten

buf_ptr += nwritten

}

return nbytes

}

一、功放面板名称功能认识:

1.混响总音量:ECHO 或者 ECHO VOL 该旋钮可以控制混响回音的直达声大 小,也就是整个混响效果的多与少! 注意: 配合该功能使用的还有两个功能旋钮--REPEAT(混响的重复次数长短)、 DELAY(该旋钮可以调节混响回音延长时间的森行长短)这 3 个功能旋钮必须配合使 用,缺一不可,否则效果不理想,要想调试出比较满意的效果必须 3 个旋钮一起 调节,反复感觉。

2.话筒总音量:MIC VOL 该旋钮可以控制所有话筒的音量。 注意:话筒总音量下面还有 3 个话筒音量控制旋钮,可以分别控制各个话筒的音 量:MIC1 (话筒 1 音量) MIC2(话筒 2 音量) MIC3(话筒3音量) 。

3.音乐总音量:MUSIC VOL 该旋钮可以控制电脑伴奏的音量大小,调节该旋 钮可以实现歌曲声音的大小 。

4.音质控制:MIC BASS(话筒低音) MIC TREBLE(话筒高音) MUSIC BASS (音乐低音) MUSIC TREBLE(音乐高音) 5:左右声道平衡:BALANCE 该旋钮必须调在正中间,否则左右音箱发出来的 声音大小不一样 。

二、调音技巧:

1.关于话筒啸叫 通常话筒啸叫都是由于话筒的音量过大造成的,要仔细看看是属于话筒总音量过 大造成还是属于个别话筒音量过大造成。 另一个造成话此唯哗筒啸叫的原因就是话筒音 质过大造成的,要仔细听一下啸叫的频率:很刺耳的尖叫是属于 MIC TREBLE(话 筒山拦高音)造成的,必须把话筒高音减小点。

2.通常情况下,也就是在营业期间,如果客人要求调节一下混响的轻与重,尽 量不要去调节混响效果里面的 REPEAT 或者 DELAY,只要把 ECHO(ECHO VOL) 加大或者减少就可以。

3.电脑音乐伴奏音量的控制以不要覆盖过客人唱歌的声音为主。 否则客人唱歌 会觉得辛苦,吃力,费劲。

4.在调音技术当中也有个关键的问题,就是话筒的配对问题。 如果一个包厢里 面的话筒不是统一一个牌子的话,那么它们的频率也就不一样的,说简单点就是 话筒的音质不一样,如果它们的音质不一样的话,我们调音的时候就很难办了, 当你照顾好这个牌子的话筒的音质后,那另外个牌子的话筒音质又体现不出来 了。

echo命令

(1)功能:打开或关闭命令回显(即命令运行时的显示)/显示信息

(2)语法:echo [{on|off}] [message]

(3)参数:on 打开命令回显。

off 关闭命令回显。

message 指定要显示的文本激乱拆(例:执行“@echo This a ECHO command.”,显示“This a ECHO command.”)。

(4)特殊用法:“echo”不带任何参数将显示当前回显设置。“echo.”显示一个空行。

echo好像还有些复杂的用法,明枣但作为作业应该只是实现回显吧。

你的程序只能一个字符一个字符的输入,要一次回显应该用带参数的main:陪戚

void main(int argc ,char *argv[])

{

for (int i=1i<argci++)

cout<<argv[i]<<' '

cout<<endl

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12349596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存